IdentityServer4是一套身份授权以及访问控制的解决方案,专注于帮助使用.Net 技术的公司为现代应用程序建立标识和访问控制解决方案,包括单点登录、身份管理、授权和API安全。

下面我将具体介绍如何在.Net Core中实现OAuth授权,从最简单的授权模式开始,在上一篇对OAuth2.0的详细描述中,在客户端模式中,我们说它在严格意义上讲是不存在授权的问题,我们再来看下它的授权流程:

客户端在向授权服务器申请令牌后,授权服务器直接将令牌返回给了客户端,这个过程不需要其他角色的任何操作,只是客户端和授权服务器的交互。我们结合具体的示例来进一步了解这个过程。

操作系统:Mac OS

开发工具:VS Code

调试工具:Postman

开发框架:.Net Core 2.0

在具体示例实现之前,先说一下在VS Code我们会用到的插件,以方便我们的开发,毕竟VS Code没有我们宇宙第一IDE-Visual Studio那么强大,但是也是目前为止最好用的编辑器,它提供了各式各样的插件,几乎满足我们所有的开发需求。在这里我们用到的一个插件叫做Nuget Package Manager,这个插件可以方便我们使用快捷键对Nuget包进行管理。

接下来我们首先创建一个授权服务器的项目,打开VS Code使用控制台,创建一个WebApi的项目,使用命令:

 dotnet new WebApi -n IdentityServer4.Server

创建完成后,我们可以启动查看我们的项目,run一下:

这样我们的项目是可以运行成功的,下面我们进行添加IdentitServer4包的引用,在我们安装了Nuget Package Manager后,我们可以快速的使用快捷键,在Mac系统中使用command+p,然后输入">",然后输入Nuget... (注意一定要切换到当前的项目下)会出现以下提示:

选择第一个选项添加Package:

按回车,选择IdentityServer4最新版本的安装,这里是2.1.3,安装完后,我们在StartUp中添加IdentityServer4的引用,并使用AddIdentityServer()方法在依赖注入系统中注册IdentityServer,当然这里我们也可以等到添加完配置类后再进行操作。我们先添加一个配置类,叫做Config.cs,首先定义一个管道(Scope),指定我们所保护Api资源,该方法返回一个ApiResources集合,具体代码如下:new ApiResource("api","UsersApi"),第一个参数为Api的名称,第二个参数为显示的名称:

下一步进行客户端注册,定义给客户端可以返回的资源,即允许哪个Scope定义,代码如下:

下面我们将该配置注入到系统中,

AddDeveloperSigningCredential(),是一种RSA证书加密方式,它会生成一个tempkey.rsa证书文件,项目每次启动时,会检查项目根目录是否存在该证书文件,若不存在,则会生成该文件,否则会继续使用该证书文件。后面依次将ApiResources和Clients添加到内存中。

下一步是配置IdentityServer4的管道,在Configure里面添加,app.UseIdentityServer(),在这里我们用不到mvc,将app.UseMvc()注释掉即可。下面我们运行我们的项目,当然直接访问http://localhost:5000是看不到任何东西的,在这里我们使用一个固定的地址http://localhost:5000/.well-known/openid-configuration,可以查看IdentityServer4的配置信息,运行格式化后内容如下:

{
"issuer": "http://localhost:5000",
"jwks_uri": "http://localhost:5000/.well-known/openid-configuration/jwks",
"authorization_endpoint": "http://localhost:5000/connect/authorize",
"token_endpoint": "http://localhost:5000/connect/token",
"userinfo_endpoint": "http://localhost:5000/connect/userinfo",
"end_session_endpoint": "http://localhost:5000/connect/endsession",
"check_session_iframe": "http://localhost:5000/connect/checksession",
"revocation_endpoint": "http://localhost:5000/connect/revocation",
"introspection_endpoint": "http://localhost:5000/connect/introspect",
"frontchannel_logout_supported": true,
"frontchannel_logout_session_supported": true,
"backchannel_logout_supported": true,
"backchannel_logout_session_supported": true,
"scopes_supported": [
"api",
"offline_access"
],
"claims_supported": [],
"grant_types_supported": [
"authorization_code",
"client_credentials",
"refresh_token",
"implicit"
],
"response_types_supported": [
"code",
"token",
"id_token",
"id_token token",
"code id_token",
"code token",
"code id_token token"
],
"response_modes_supported": [
"form_post",
"query",
"fragment"
],
"token_endpoint_auth_methods_supported": [
"client_secret_basic",
"client_secret_post"
],
"subject_types_supported": [
"public"
],
"id_token_signing_alg_values_supported": [
"RS256"
],
"code_challenge_methods_supported": [
"plain",
"S256"
]
}
这表明我们的IdentityServer已经配置成功,下面我们借助Postman模拟发起获取令牌请求,我们使用token_point的地址:http://localhost:5000/connect/token获取acces token,Postman配置如下:

上面指定的3个参数都是客户端模式需要指定的参数,下面就是我们请求到的access token。接着我们创建一个Api,去调用我们的授权服务器进行授权,重复上面的步骤,创建一个WebApi项目,不再赘述,直接去配置调用授权服务器,这个项目只是一个Api的项目,不需要完整的IdentityServer4的引用,只引用一个IdentityServer4.AccessTokenValidation包就可以了。在授权服务器中我们已经占用5000端口,所以在这个项目中我们指定为5001端口,在Program.cs里面指定5001端口,添加.UseUrls("http://localhost:5001"):

在ValuesController里面添加 Microsoft.AspNetCore.Authorization的引用,并添加[Authorize]标签,即要求该Controller要通过授权才可以访问,

下面我们在StartUp.cs里面去配置授权服务:

接着我们分别启动授权服务器和Api,我们运行Api,访问:http://localhost:5001/api/values ,访问结果如下:

提示Http Error 401 ,在状态码中401即未授权,我们把它拿到Postman中运行:

我们在Headers中指定Authorization 模式为Bearer,状态401 未授权,这个结果也是我们意料中的结果了,因为我们并未获取到令牌,我们继续使用Postman模拟获取到access token,

我们将获取到的access_token放到Api的Headers里面:

注意令牌与Bearer中间加空格,接下来继续请求:

这样我们就拿到了Api里面要获取的值了,到这里我们使用Postman验证了我们的结果,下面我们再创建一个第三方应用,去请求我们的Api资源,继续了解我们的授权流程,客户端我使用控制台程序进行测试。

我们继续使用命令行创建第三方应用,名称为ThirdPartyApplication,IdentityServer4有一个专门专门为客户端程序用的Nuget包,叫做IdentityModel,我们还是通过快捷键添加Nuget Package,下面直接上代码,必要说明会在代码中直接注释:

using System;
using System.Net.Http;
using IdentityModel;
using IdentityModel.Client; namespace ThirdPartyApplication
{
class Program
{
static void Main(string[] args)
{
//请求授权服务器
var diso=DiscoveryClient.GetAsync("http://localhost:5000").Result;
if(diso.IsError)
{
Console.WriteLine(diso.Error);
} //授权服务器根据客户端发来的请求返回令牌
var tokenClient=new TokenClient(diso.TokenEndpoint,"Client","secret");
var tokenResponse=tokenClient.RequestClientCredentialsAsync("api").Result;
if(tokenResponse.IsError)
{
Console.WriteLine(tokenResponse.Error);
}
//如果成功,则打印输出返回的令牌信息
else
{
Console.WriteLine(tokenResponse.Json);
} //创建HttpClient对象
var httpClient=new HttpClient(); //设置Authorization的Value值
httpClient.SetBearerToken(tokenResponse.AccessToken); //根据授权服务器返回的令牌信息请求Api资源
var response= httpClient.GetAsync("http://localhost:5001/api/values").Result; //如果返回结果为成功,输出Api资源的结果
if(response.IsSuccessStatusCode)
{
Console.WriteLine(response.Content.ReadAsStringAsync().Result);
}
}
}
}

下面输出结果:

以上就是我们整个OAuth2.0授权模式中完整的客户端授权模式了,以上流程简化如下:

后面文章会继续讲解其他几种授权模式的使用。各位,晚安。

扫描二维码关注我的公众号,共同学习,共同进步!

IdentityServer4在Asp.Net Core中的应用(一)的更多相关文章

  1. IdentityServer4在Asp.Net Core中的应用(三)

    今天的内容是授权模式中的简化模式,还是先看以下授权流程图: 在这种模式中我们将与OpenID结合使用,所以首先我们要了解OpenID和OAuth的区别,关于他们的区别,在我上一篇博客<理解Ope ...

  2. IdentityServer4在Asp.Net Core中的应用(二)

    继续上次授权的内容,客户端模式后我们再说以下密码模式,先回顾下密码模式的流程: 我们还是使用上次的代码,在那基础上修改,在IdentityServer4里面有一个IdentityServer4.Tes ...

  3. Asp.Net Core 中IdentityServer4 授权中心之应用实战

    一.前言 查阅了大多数相关资料,查阅到的IdentityServer4 的相关文章大多是比较简单并且多是翻译官网的文档编写的,我这里在 Asp.Net Core 中IdentityServer4 的应 ...

  4. Asp.Net Core 中IdentityServer4 授权中心之自定义授权模式

    一.前言 上一篇我分享了一篇关于 Asp.Net Core 中IdentityServer4 授权中心之应用实战 的文章,其中有不少博友给我提了问题,其中有一个博友问我的一个场景,我给他解答的还不够完 ...

  5. Asp.Net Core 中IdentityServer4 授权原理及刷新Token的应用

    一.前言 上面分享了IdentityServer4 两篇系列文章,核心主题主要是密码授权模式及自定义授权模式,但是仅仅是分享了这两种模式的使用,这篇文章进一步来分享IdentityServer4的授权 ...

  6. Asp.Net Core 中IdentityServer4 实战之 Claim详解

    一.前言 由于疫情原因,让我开始了以博客的方式来学习和分享技术(持续分享的过程也是自己学习成长的过程),同时也让更多的初学者学习到相关知识,如果我的文章中有分析不到位的地方,还请大家多多指教:以后我会 ...

  7. Asp.Net Core 中IdentityServer4 实战之角色授权详解

    一.前言 前几篇文章分享了IdentityServer4密码模式的基本授权及自定义授权等方式,最近由于改造一个网关服务,用到了IdentityServer4的授权,改造过程中发现比较适合基于Role角 ...

  8. 大话IdentityServer4之使用 IdentityServer4 保护 ASP.NET Core 应用

    这几天一直在研究IdentityServer4在asp.net core3.0中的应用,下面说说我的理解: 我们每一个.net core 项目大家可以理解为我新建了一个动物园或者植物园等,注册用户想要 ...

  9. 从零搭建一个IdentityServer——聊聊Asp.net core中的身份验证与授权

    OpenIDConnect是一个身份验证服务,而Oauth2.0是一个授权框架,在前面几篇文章里通过IdentityServer4实现了基于Oauth2.0的客户端证书(Client_Credenti ...

随机推荐

  1. genymotion——在虚拟机中当中安装genymotion,启动已经新增好的设备时,提示:the virtual device got no ip address

    1.启动已经新增好的设备时,提示:the virtual device got no ip address,于是在网上搜索该问题,便得到提示,先启动virtual box中的该模拟设备,于是便启动,出 ...

  2. python3 对excel读、写、修改的操作

    一.对excel的写操作实例: 将一个列表的数据写入excel, 第一行是标题,下面行数具体的数据 import xlwt #只能写不能读 stus = [['姓名', '年龄', '性别', '分数 ...

  3. hdu6208 The Dominator of Strings

    地址: 题目: The Dominator of Strings Time Limit: 3000/3000 MS (Java/Others)    Memory Limit: 65535/32768 ...

  4. HDU - 4609 3-idiots (FFT+母函数)

    题意:给N个数,求任意选三个数能构成三角形的概率 分析:枚举两条边之和的复杂度\(O(N^2)\),显然不行,所以要更高效地做到枚举出两边之和. 所以用生成函数搭配FFT在\(O(NlogN)\)的时 ...

  5. servlet中通过getWriter()获取out返回给浏览器出现中文乱码问题

    感谢博主https://blog.csdn.net/louyongfeng3613/article/details/50160317 在Servlet编程中,经常需要通过response对象将一些信息 ...

  6. 【Linux学习】2.Linux常见命令行

    记录学习Linux 系统的相关知识点,欢迎大家拍砖交流,一起成长:QQ:2712192471 作者背景:前端开发工程师 | Python | web安全爱好者   Linux命令行: 系统关机重启 s ...

  7. BigDecimal处理加减乘除

    public static void main(String[] args) { BigDecimal totalDoneAmt = new BigDecimal(2); Double d1 = ad ...

  8. 在Pycharm中配置Github

    Pycharm是当前进行python开发,尤其是Django开发最好的IDE.GitHub是程序员的圣地,几乎人人都在用. 本文假设你对pycharm和github都有一定的了解,并且希望在pycha ...

  9. 20145216史婧瑶《Java程序设计》第10周学习总结

    20145216 <Java程序设计>第10周学习总结 教材学习内容总结 网络编程 一.网络概述 网络编程就是两个或多个设备(程序)之间的数据交换. 识别网络上的每个设备:①IP地址②域名 ...

  10. Centos7 Python3.x源码安装

    第一步,安装开发工具集 yum -y groupinstall "Development tools" 第二步,安装相关依赖包: yum -y install zlib-devel ...