介绍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.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签名的ras文件,接着

调用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验证.

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

.Net Core 认证系统之基于Identity Server4 Token的JwtToken认证源码解析的更多相关文章

  1. Java并发包源码学习系列:基于CAS非阻塞并发队列ConcurrentLinkedQueue源码解析

    目录 非阻塞并发队列ConcurrentLinkedQueue概述 结构组成 基本不变式 head的不变式与可变式 tail的不变式与可变式 offer操作 源码解析 图解offer操作 JDK1.6 ...

  2. .Net Core 认证系统之Cookie认证源码解析

    接着上文.Net Core 认证系统源码解析,Cookie认证算是常用的认证模式,但是目前主流都是前后端分离,有点鸡肋但是,不考虑移动端的站点或者纯管理后台网站可以使用这种认证方式.注意:基于浏览器且 ...

  3. ASP.NET Core WebApi基于Redis实现Token接口安全认证

    一.课程介绍 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NET WebSer ...

  4. 基于LNMP的Zabbbix之Zabbix Agent源码详细安装,但不给图

    基于LNMP的Zabbbix之Zabbix Server源码详细安装:http://www.cnblogs.com/losbyday/p/5828547.html wget http://jaist. ...

  5. 自学Linux Shell9.4-基于Red Hat系统工具包存在两种方式之二:源码包

    点击返回 自学Linux命令行与Shell脚本之路 9.4-基于Red Hat系统工具包存在两种方式之二:源码包 本节主要介绍基于Red Had的系统(测试系统centos) 1. 工具包存在两种方式 ...

  6. Roslyn 入门:使用 .NET Core 版本的 Roslyn 编译并执行跨平台的静态的源码

    Roslyn 是微软为 C# 设计的一套分析器,它具有很强的扩展性.以至于我们只需要编写很少量的代码便能够编译并执行我们的代码. 作为 Roslyn 入门篇文章之一,你将可以通过本文学习如何开始编写一 ...

  7. Java生鲜电商平台-电商会员体系系统的架构设计与源码解析

    Java生鲜电商平台-电商会员体系系统的架构设计与源码解析 说明:Java生鲜电商平台中会员体系作为电商平台的基础设施,重要性不容忽视.我去年整理过生鲜电商中的会员系统,但是比较粗,现在做一个最好的整 ...

  8. Java生鲜电商平台-优惠券系统的架构设计与源码解析

    Java生鲜电商平台-优惠券系统的架构设计与源码解析 电商后台:实例解读促销系统 电商后台系统包括商品管理系统.采购系统.仓储系统.订单系统.促销系统.维权系统.财务系统.会员系统.权限系统等,各系统 ...

  9. Java生鲜电商平台-促销系统的架构设计与源码解析

    Java生鲜电商平台-促销系统的架构设计与源码解析 说明:本文重点讲解现在流行的促销方案以及源码解析,让大家对促销,纳新有一个深入的了解与学习过程. 促销系统是电商系统另外一个比较大,也是比较复杂的系 ...

随机推荐

  1. 《attention is all you need》解读

    Motivation: 靠attention机制,不使用rnn和cnn,并行度高 通过attention,抓长距离依赖关系比rnn强 创新点: 通过self-attention,自己和自己做atten ...

  2. oracle连接多个扫描

    如果你对一个列和一组有限的值进行比较, 优化器可能执行多次扫描并对结果进行合并连接. 举例: SELECT * FROM LODGING WHERE MANAGER IN (‘BILL GATES’, ...

  3. vue+file-saver+xlsx导出table表格为excel

    https://blog.csdn.net/wjswangjinsheng/article/details/91393396

  4. ES6语法~解构赋值、箭头函数、class类继承及属性方法、map、set、symbol、rest、new.target、 Object.entries...

    2015年6月17日 ECMAScript 6发布正式版本 前面介绍基本语法,  后面为class用法及属性方法.set.symbol.rest等语法. 一.基本语法:  1.         定义变 ...

  5. 4-2 setting中一定要将ROBOTSTXT_OBEY = False的注释去掉

    # Obey robots.txt rules##默认遵循robots协议的,默认去读取每个网站上的robots协议ROBOTSTXT_OBEY = False

  6. 阿里巴巴Java编程规范考试

    阿里巴巴Java编程规范考试 今天在阿里云官网把阿里巴巴Java编程规范认证考试考过了, 写下这篇文章总结一下考试中需要注意的知识点, 主体内容还是要直接看规范: 编程规约 异常日志 单元测试 安全规 ...

  7. H3C 各类路由默认优先级

  8. 机器学习——SVM

    整理自: https://blog.csdn.net/woaidapaopao/article/details/77806273?locationnum=9&fps=1 带核的SVM为什么能分 ...

  9. vue脚手架搭项目 git push超时github网站打不开

    vue: 1.npm install vue-cli -g 全局安装脚手架 2.vue init webpack  name 新建项目 name为项目名称 react: 1..npm install  ...

  10. POJ 2387 Til the Cows Come Home(最短路模板)

    题目链接:http://poj.org/problem?id=2387 题意:有n个城市点,m条边,求n到1的最短路径.n<=1000; m<=2000 就是一个标准的最短路模板. #in ...