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

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

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

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

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

(3)、token验证经过,这个时候就能够拿到用户信息(ClaimsPrincipal)url

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

 

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

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

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

 

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

 由于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的内容是否有效,并解析出用户信息,源码以下:

 并返回认证结果.

因此整个核心认证流程以下:

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

二、执行一系列事件

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

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

五、执行一系列事件

六、返回用户认证结果

整个核心的流程能够抽象出以下代码:

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

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

 

注意:若是你和我同样重写了id4,同时你拿掉了文档发现tokenPoint,那么就不能用IdentityServer4.AccessTokenValidation组件了(我暂时没找到,我以为也不必,直接本身写了),只能使用JwtBear认证组件,再参考

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

纯属我的理解,能力有限,有问题,请指正,谢谢

相关文章
相关标签/搜索