.Net Core 认证系统之基于Identity Server4 Token的JwtToken认证源码解析

介绍JwtToken认证之前,必须要掌握.Net Core认证系统的核心原理,如果你还不了解,请参考.Net Core 认证组件源码解析,且必须对jwt有基本的了解,如果不知道,请百度.最重要的是你还需要掌握identity server4的基本用法,关于identity server4因为涉及到两个协议Oath2.0和openid connect协议,内容较多,不是本文重点,后续有时间我会写一片关于identity server4的源码分析.且为了保证整个系统的高度可控,我重写了整个id4,留下了password模式.如果有兴趣,可以关注本人的后续文章.

假设你已经掌握以上内容,那么整个流程可以抽象为如下步骤:

(1)、用户输入用户名密码同时带着客户端Id和客户端密钥去identity server4请求access token.(访问令牌,令牌中带着用户Id,带着客户端的名称和密码)

(2)、拿到token后,接着用户去请求客户端指定的控制器方法,那么客户端第一步,会解析token中的客户端名称和密码是否正确,还有过期时间等常规字段的判断.

(3)、token验证通过,这个时候就可以拿到用户信息(ClaimsPrincipal)

(4)、此时我们拿到持有的用户信息中的用户Id,发起httpclient或者grpc调用,去统一权限系统查找用户的权限是否有当前请求的方法,有就通过授权认证,返回数据,没有,就返回权限不足.

 

整个流程大致如上,本文的重点是当拿到id4颁发的有效令牌(token)后,客户端如何解析?

IdentityServer4 提供了IdentityServer4.AccessTokenValidation类库,用来解析id4颁发的token.

.Net Core启用IdentityServer4token验证的方法如下:

 

指定id4的认证方案,并指定认证参数,那么看看里面到底干了什么

 因为id4的令牌有访问令牌和引用令牌之分,但是password模式,只支持访问令牌,所以

 

 这两块这里就不分析了,如果你的项目用到了引用令牌.那么自行查阅代码.

ok,回到第一行代码

 很明显添加了JwtBearer的认证方案.所以IdentityServer4.AccessTokenValidation类库是基于

回到.Net Core JwtBear认证的源码如下:

 很简单,添加了方案名称为Bearer IdentityServerAuthenticationJwt的认证方案,且处理器为JwtBearerHandler,并指定参数.如果你已经掌握.Net Core的核心认证组件的流程,那么啥都不用说,直接看JwtBearerHandler干了什么,查看核心的认证方法HandleAuthenticateAsync,源码如下:

 第一步,生成上下文,执行通过JwtBearerOptions参数注册的MessageReceived事件,源码如下:

 所以,在token认证前,可以随意操作上下文,微软提示,给当前应用一个机会去拒绝一部分token。当然很明显,你可以干除了拒绝之外的很多事情.

接着

 检查http head头中的token是否合法,条件代码中也给出了.必须以Bearer开头等

接下来,这段代码就很有趣了,如果你不了解identity Server4,你肯定无法下手.

 核心对象

 这个对象在IdentityModel类库中有,但是这里不介绍了

协议层面的东东,所以可以自行查询源码.

接着回到JwtBearer认证的入口

 为啥要注入JwtBearerPostConfigureOptions这个配置对象呢?且这个配置对象是干嘛的呢?关于PostConfigureOpetions是.Net Core核心配置系统里面的一类对象,这类对象会在Options执行完毕之后执行,类似ABP模块加载系统的生命周期管理,执行完Init之后执行Post里面的方法,这里本质也是如此.ok,看看这个配置干了什么,源码如下:

 

 到这里一目了然.ConfigurationManager实际就是去远程调用文档配置(本质是去拿给token前面的rsa文件,来给token解密,并验证token的有效性)用的.

 调用的是id4的文档配置,但是我为了减少不必要的远程调用,拿掉了id4的文档发现TokenPoint.改用在客户端直接配置ras文件,来给token解密,这里因为我用的是password模式,所有的系统都是高度信任的.所以可以这样做.而且微软也考虑到了这一点,代码如下:

 你可以跳过远程调用,而改用本地直接配置.参数在JwtBearerOptions的TokenValidationParameters属性中配置.

这个时候你已经通过本地配置,或者通过调用id4的文档发现TokenPoint拿到了给token签名的rsa文件,接着

 

 

 调用JwtBearerOptions配置参数中的SecurityTokenValidators,源码如下:

 本质就是调用JwtSecurityTokenHandler去验证token的内容是否有效,并解析出用户信息,源码如下:

 并返回认证结果.

所以整个核心认证流程如下:

1、拿到http请求上下文中的token

2、执行一系列事件

3、远程调用id4文档发现服务拿到签名rsa文件或者本地指定rsa文件

4、用私钥解密token,判断其有效性

5、执行一系列事件

6、返回用户认证结果

整个核心的流程可以抽象出如下代码:

 此时就拿到可以访问的token,里面包含用户Id的信息,接着配合授权系统的动态授权功能,去权限系统判断当前用户是否具有访问当前Api的权限.就能判断当前请求是否被允许

这里只介绍了id4 token的核心认证流程,一些细节点,比如token的有效性校验,就有很多内容没介绍.不明白,可以在下面提问.

 

注意:如果你和我一样重写了id4,同时你拿掉了文档发现tokenPoint,那么就不能用IdentityServer4.AccessTokenValidation组件了(我暂时没找到,我觉得也没必要,直接自己写了),只能使用JwtBear认证组件,再参考

IdentityServer4.AccessTokenValidation组件中的IdentityServerAuthenticationOptions参数中的ConfigureJwtBearer方法指定JwtBear必须的认证参数,来实现自定义的Id4token验证.

纯属个人理解,能力有限,有问题,请指正,谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C# 调用 Go 语言】0x2 参数、返回值与类型转换

在上篇文章【C# 调用 Go 语言】0x1 Hello Golang 中,我们将 Golang 源码编译为动态链接库(dll),用 C# 调用 Golang 导出的方法并成功的看到了控制台的输出。本篇文章将对 C# 调用 Golang 方法做更详细的介绍,涉及如何…

《ASP.NET Core 微服务实战》-- 读书笔记(第1章 、第2章)

译者序微服务设计方法清晰定义了各个开发团队的业务边界,微服务框架以不同方式实现了服务之间的协作与集成。.NET Core 作为全新的 .NET 技术,它不仅完全开源、跨平台,更面向云原生开发进行了大量细致的优化。它完全模块化,不依赖…

html缩进标签quote,HTML blockquote 标签

HTML 标签标签同样是对文本进行引用,不同的是该标签引用的是长文本。标签内的内容会自动有缩进。实例定义一个摘自另一个源的块引用:For 50 years, WWF has been protecting the future of nature. The worlds leading conservation organization, WWF w…

使用BeetleX.NetBenchmark压测TCP,HTTP和Websocket服务

真没想到大过年还在家里写代码写文章,本来还打算自驾半个月没想出现这情况。在这里祝福全国同胞在新的一年里身体健康!希望阳光天气早日照射在这片土地上,给人带来新一年的希望!NetBenchmark是针对网络服务压测的开源组件&#xf…

如何使用Serilog.AspNetCore记录ASP.NET Core3.0的MVC属性

这是Serilog系列的第三篇文章。第1部分-如何利用Serilog的RequestLogging来精简ASP.NET Core的日志输出第2部分-Serilog高级玩法之用Serilog记录所选终结点附加属性第3部分-使用Serilog.AspNetCore记录MVC属性(本文)第4部分-从Serilog请求记录中排除运行…

广东省计算机媒体大赛,广东省大学生计算机设计大赛

广东省大学生计算机设计大赛由广东省教育厅主办。比赛宗旨为进一步提高广东省高校计算机教学和信息技术与学科深度融合的水平,激发省内各高校各专业大学生学习计算机知识和技能的兴趣和潜能,提升大学生运用信息技术解决实际问题的综合实践能力&#xff0…

哈希表-拉链法及应用举例

哈希表存储结构: 1.开放寻址法 2.拉链法 哈希表的主要作用: 把一个较大(0-10^9 )的数据映射到较小(0-N(N一般为10^5 到 10^6))的数据 哈希函数:可以把一个从-10^19 到10^19 的中的一个数映射到0-10^5之间的一个数 1.哈希函数怎么写&#x…

各互联网公司延期上班一览

【延期上班,自我隔离】自从1月26日,国家颁布了延长春节假期的公告之后,互联网行业各公司也纷纷更新了自己的延期上班计划,如下表所示:可以看到,多数公司采取了在家办公的这种模式,还有些公司直接…

计算机系统占有率,微软继续领跑PC操作系统市场 Win10占有率突破25%

腾讯科技讯,据外媒报道,发布一年半之后,Windows 10的市场占有率终于跨过25%这一里程碑,这就意味着,如今世界上每四台电脑中就有一台运行Windows 10系统。Net Applications的数据显示,Windows 10发布后四周内…

递推求组合数

组合数计算公式&#xff1a; 递推公式&#xff1a; 代码模板&#xff1a; #include <iostream> using namespace std; const int N 1010; int c[N][N];int main() {int a,b;cin>>a>>b;//a在下&#xff0c;b在上for (int i 0;i<N;i)for (int j 0;j&…

微软发布 Power BI 2020 上半年发行计划

微软官方与日前发布了 Power BI 在2020上半年的发行计划。本文将在 2020.9 之前都有用&#xff0c;建议收藏查看。从今年开始&#xff0c;我们除了客观描述 Power BI 的特性外&#xff0c;还将加入大量主观观点态度和吐槽&#xff0c;不过不管怎么吐&#xff0c;都只能继续用&a…

AcWing 523. 组合数问题

组合数 Cmn 表示的是从 n 个物品中选出 m 个物品的方案数。  举个例子&#xff0c;从 (1, 2, 3) 三个物品中选择两个物品可以有 (1, 2), (1, 3), (2, 3) 这三种选择方法。  根据组合数的定义&#xff0c;我们可以给出计算组合数 Cmn 的一般公式&#xff1…

远程办公经验为0,如何将日常工作平滑过度到线上?

导语 | 受到疫情影响&#xff0c;很多企业开始考虑远程办公。近日&#xff0c;TVP群里的各位老师们对此话题展开了热烈讨论。TVP张善友老师作为一名创业者&#xff0c;也决定开启远程办公。本文是他对相关经验总结而得的方案&#xff0c;并列出了相关产品清单&#xff0c;希望对…

华为v30pro计算机在哪里,请问V30PRO的数据怎么转到电脑上

[分享交流]请问V30PRO的数据怎么转到电脑上26343电梯直达花粉199050253新学乍练发表于 2020-10-2 18:48:36来自&#xff1a;荣耀V30 Pro 5G最新回复 2020-10-2 19:18:00冷不悔独步江湖发表于 2020-10-2 18:50:59来自&#xff1a;荣耀V30 Pro 5G你所说的数据具体点&#xff0c;图…

伦斯勒理工大学计算机专业好申请吗,2020年伦斯勒理工学院申请难度

伦斯勒理工学院简介伦斯勒理工大学&#xff0c;中国教育部官方名称&#xff1a;仁斯利尔理工大学&#xff0c;英文原名Rensselaer Polytechnic Institute&#xff0c;简称RPI&#xff0c;为全美顶尖理工大学&#xff0c;美国东部高等学府&#xff0c;位于美国纽约州首府奥尔巴尼…

致 wuhan2020 开源社区全体成员的一封信

各位 wuhan2020 开源社区成员&#xff1a;2020年1月25日&#xff0c;春节&#xff0c;在这个特殊的日子&#xff0c;我们正式发起了《wuhan2020&#xff1a;武汉新型冠状病毒防疫开源信息收集平台》的开源项目&#xff0c;用开发者们的方式支援这场没有硝烟的战争。截至2020年1…

如何加入到 wuhan2020 开源项目,打赢这场没有硝烟的战争?

比尔盖茨2015年在 Ebola 爆发之后做的 TED 演讲前言这是比尔盖茨2015年在 Ebola 爆发之后做的 TED 演讲。他认为在未来几十年里&#xff0c;如果有什么东西可以杀掉上千万人&#xff0c;那更可能是个有高度传染性的病毒&#xff0c;而不是战争&#xff1b;不是导弹&#xff0c;…

dotnet core 通过 frp 发布自己的网站

很多时候写出来的网站只能自己内网访问&#xff0c;本文告诉大家如何通过 Frp 将自己的 asp dotnet core 网站发布到外网&#xff0c;让小伙伴访问自己的网站 通过 frp 的方式&#xff0c;可以解决自己的服务器性能太差的问题&#xff0c;通过 frp 的方式需要先存在一个外网的服…

AcWing 211. 计算系数

代码如下&#xff1a; #include <iostream> using namespace std; const int N 1010; const int MOD 10007; int c[N][N]; typedef long long LL; int power(int a,int b) {int res 1;a a%MOD;while(b--) res res*a%MOD;return res; }int main() {int a,b,k,n,m;c…

感谢所有支持wuhan2020项目的朋友!我们招换更多人加入!

2020年1月25日&#xff0c;春节&#xff0c;在这个特殊的日子&#xff0c;我们正式发起了《wuhan2020&#xff1a;武汉新型冠状病毒防疫开源信息收集平台》的开源项目&#xff0c;用开发者们的方式支援这场没有硝烟的战争。截至2020年1月27日17时&#xff0c;全国共有2823个确诊…