【.NET Core项目实战-统一认证平台】第八章 授权篇-IdentityServer4源码分析

上篇文章我介绍了如何在网关上实现客户端自定义限流功能,基本完成了关于网关的一些自定义扩展需求,后面几篇将介绍基于IdentityServer4(后面简称Ids4)的认证相关知识,在具体介绍ids4实现我们统一认证的相关功能前,我们首先需要分析下Ids4源码,便于我们彻底掌握认证的原理以及后续的扩展需求。

.netcore项目实战交流群(637326624),有兴趣的朋友可以在群里交流讨论。

一、Ids4文档及源码

文档地址 http://docs.identityserver.io/en/latest/

Github源码地址 https://github.com/IdentityServer/IdentityServer4

二、源码整体分析

【工欲善其事,必先利其器,器欲尽其能,必先得其法】

在我们使用Ids4前我们需要了解它的运行原理和实现方式,这样实际生产环境中才能安心使用,即使遇到问题也可以很快解决,如需要对认证进行扩展,也可自行编码实现。

源码分析第一步就是要找到Ids4的中间件是如何运行的,所以需要定位到中间价应用位置app.UseIdentityServer();,查看到详细的代码如下。

640?wx_fmt=png

通过上面的源码,我们知道整体流程分为这5步实现。接着我们分析下每一步都做了哪些操作呢?

1、app.Validate()为我们做了哪些工作?

  • 校验IPersistedGrantStore、IClientStore、IResourceStore是否已经注入?

  • 验证IdentityServerOptions配置信息是否都配置完整

  • 输出调试相关信息提醒

640?wx_fmt=png

640?wx_fmt=png

详细的实现代码如上所以,非常清晰明了,这时候有人肯定会问这些相关的信息时从哪来的呢?这块我们会在后面讲解。

2、BaseUrlMiddleware中间件实现了什么功能?

源码如下,就是从配置信息里校验是否设置了PublicOrigin原始实例地址,如果设置了修改下请求的SchemeHost,最后设置IdentityServerBasePath地址信息,然后把请求转到下一个路由。

640?wx_fmt=png

这里源码非常简单,就是设置了后期要处理的一些关于请求地址信息。那这个中间件有什么作用呢?

就是设置认证的通用地址,当我们访问认证服务配置地址http://localhost:5000/.well-known/openid-configuration的时候您会发现,您设置的PublicOrigin会自定应用到所有的配置信息前缀,比如设置option.PublicOrigin = "http://www.baidu.com";,显示的json代码如下。

640?wx_fmt=png

可能还有些朋友觉得奇怪,这有什么用啊?其实不然,试想下如果您部署的认证服务器是由多台组成,那么可以设置这个地址为负载均衡地址,这样访问每台认证服务器的配置信息,返回的负载均衡的地址,而负载均衡真正路由到的地址是内网地址,每一个实例内网地址都不一样,这样就可以负载生效,后续的文章会介绍配合Consul实现自动的服务发现和注册,达到动态扩展认证节点功能。

可能表述的不太清楚,可以先试着理解下,因为后续篇幅有介绍负载均衡案例会讲到实际应用。

3、app.ConfigureCors(); 做了什么操作?

其实这个从字面意思就可以看出来,是配置跨域访问的中间件,源码就是应用配置的跨域策略。

640?wx_fmt=png

很简单吧,至于什么是跨域,可自行查阅相关文档,由于篇幅有效,这里不详细解释。

4、app.UseAuthentication();做了什么操作?

就是启用了默认的认证中间件,然后在相关的控制器增加[Authorize]属性标记即可完成认证操作,由于本篇是介绍的Ids4的源码,所以关于非Ids4部分后续有需求再详细介绍实现原理。

5、IdentityServerMiddleware中间件做了什么操作?

这也是Ids4的核心中间件,通过源码分析,哎呀!好简单啊,我要一口气写100个牛逼中间件。哈哈,我当时也是这么想的,难道真的这么简单吗?接着往下分析,让我们彻底明白Ids4是怎么运行的。

640?wx_fmt=png

640?wx_fmt=png

第一步从本地提取授权记录,就是如果之前授权过,直接提取授权到请求上下文。说起来是一句话,但是实现起来还是比较多步骤的,我简单描述下整个流程如下。

1、执行授权

如果发现本地未授权时,获取对应的授权处理器,然后执行授权,看是否授权成功,如果授权成功,赋值相关的信息,常见的应用就是自动登录的实现。

比如用户U访问A系统信息,自动跳转到S认证系统进行认证,认证后调回A系统正常访问,这时候如果用户U访问B系统(B系统也是S统一认证的),B系统会自动跳转到S认证系统进行认证,比如跳转到/login页面,这时候通过检测发现用户U已经经过认证,可以直接提取认证的所有信息,然后跳转到系统B,实现了自动登录过程。

640?wx_fmt=png

获取路由处理器

其实这个功能就是拦截请求,获取对应的请求的处理器,那它是如何实现的呢?

IEndpointRouter是这个接口专门负责处理的,那这个方法的实现方式是什么呢?可以右键-转到实现,我们可以找到EndpointRouter方法,详细代码如下。

640?wx_fmt=png

640?wx_fmt=png

源码功能我做了简单的讲解,发现就是提取对应路由处理器,然后转换成IEndpointHandler接口,所有的处理器都会实现这个接口。但是IEnumerable<Endpoint>记录是从哪里来的呢?而且为什么可以获取到指定的处理器,可以查看如下代码,原来都注入到默认的路由处理方法里。

640?wx_fmt=png

640?wx_fmt=png

  1. 通过现在分析,我们知道了路由查找方法的原理了,以后我们想增加自定义的拦截器也知道从哪里下手了。

  2. 执行路由过程并返回结果

    有了这些基础知识后,就可以很好的理解var result = await endpoint.ProcessAsync(context);这句话了,其实业务逻辑还是在自己的处理器里,但是可以通过调用接口方法实现,是不是非常优雅呢?

    为了更进一步理解,我们就上面列出的路由发现地址(http://localhost:5000/.well-known/openid-configuration)为例,讲解下运行过程。通过注入方法可以发现,路由发现的处理器如下所示。

640?wx_fmt=png

可以请求的地址会被拦截,然后进行处理。

它的详细代码如下,跟分析的一样是实现了IEndpointHandler接口。

640?wx_fmt=png

通过上面代码说明,可以发现通过4步完成了整个解析过程,然后输出最终结果,终止管道继续往下进行。

640?wx_fmt=png

路由发现的具体实现代码如下,就是把结果转换成Json格式输出,然后就得到了我们想要的结果。

640?wx_fmt=png

到此完整的路由发现功能及实现了,其实这个实现比较简单,因为没有涉及太多其他关联的东西,像获取Token和就相对复杂一点,然后分析方式一样。

6、继续运行下一个中间件

有了上面的分析,我们可以知道整个授权的流程,所有在我们使用Ids4时需要注意中间件的执行顺序,针对需要授权后才能继续操作的中间件需要放到Ids4中间件后面。

三、获取Token执行分析

为什么把这块单独列出来呢?因为后续很多扩展和应用都是基础Token获取的流程,所以有必要单独把这块拿出来进行讲解。有了前面整体的分析,现在应该直接这块源码是从哪里看了,没错就是下面这句。

 builder.AddEndpoint<TokenEndpoint>(EndpointNames.Token, ProtocolRoutePaths.Token.EnsureLeadingSlash());

他的执行过程是TokenEndpoint,所以我们重点来分析下这个是怎么实现这么复杂的获取Token过程的,首先放源码。

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

执行步骤如下:

  1. 验证是否为Post请求且使用form-data方式传递参数(直接看代码即可)

  2. 验证客户端授权

    详细的验证流程代码和说明如下。

    ClientSecretValidator.cs

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

验证请求的信息是否有误

由于代码太多,只列出TokenRequestValidator.cs部分核心代码如下,

640?wx_fmt=png

1、创建生成的结果

TokenResponseGenerator.cs根据不同的认证方式执行不同的创建方法,由于篇幅有限,每一个是如何创建的可以自行查看源码。

640?wx_fmt=png

1、写入日志记录

为了调试方便,把生成的token相关结果写入到日志里。

2、输出最终结果

把整个执行后的结果进行输出,这样就完成了整个验证过程。

四、总结

通过前面的分析,我们基本掌握的Ids4整体的运行流程和具体一个认证请求的流程,由于源码太多,就未展开详细的分析每一步的实现,具体的实现细节我会在后续Ids4相关章节中针对每一项的实现进行讲解,本篇基本都是全局性的东西,也在讲解了了解到了客户端的认证方式,但是只是介绍了接口,至于接口如何实现没有讲解,下一篇我们将介绍Ids4实现自定义的存储并使用dapper替换EFCore实现与数据库的交互流程,减少不必要的请求开销。

对于本篇源码解析还有不理解的,可以进入QQ群:637326624进行讨论。

相关文章:

  • AspNetCore中使用Ocelot之 IdentityServer4

  • Ocelot-基于.NET Core的开源网关实现

  • .NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权

  • Swagger如何访问Ocelot中带权限验证的API

  • Ocelot.JwtAuthorize:一个基于网关的Jwt验证包

  • .NET Core微服务之基于Ocelot实现API网关服务

  • .NET Core微服务之基于Ocelot实现API网关服务(续)

  • .NET微服务体系结构中为什么使用Ocelot实现API网关

  • Ocelot简易教程(一)之Ocelot是什么

  • Ocelot简易教程(二)之快速开始1

  • Ocelot简易教程(二)之快速开始2

  • Ocelot简易教程(三)之主要特性及路由详解

  • Ocelot简易教程(四)之请求聚合以及服务发现

  • Ocelot简易教程(五)之集成IdentityServer认证以及授权

  • Ocelot简易教程(六)之重写配置文件存储方式并优化响应数据

  • Ocelot简易教程(七)之配置文件数据库存储插件源码解析

  • ASP.NET Core中Ocelot的使用:API网关的应用

  • ASP.NET Core中Ocelot的使用:基于Spring Cloud Netflix Eureka的动态路由

  • ASP.NET Core中Ocelot的使用:基于服务发现的负载均衡

  • 【.NET Core项目实战-统一认证平台】第一章 功能及架构分析

  • 定制Ocelot来满足需求

  • 【.NET Core项目实战-统一认证平台】第三章 网关篇-数据库存储配置(1)

  • 【.NET Core项目实战-统一认证平台】第四章 网关篇-数据库存储配置(2)

  • 【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis

  • 【.NET Core项目实战-统一认证平台】第六章 网关篇-自定义客户端授权

  • 【.NET Core项目实战-统一认证平台】第七章 网关篇-自定义客户端限流


原文地址:https://www.cnblogs.com/jackcao/p/10031828.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

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

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

相关文章

T183637-变异距离(2021 CoE III C)【单调栈】

正题 题目链接:https://www.luogu.com.cn/problem/T183637 题目大意 给出nnn个二元组(xi,yi)(x_i,y_i)(xi​,yi​)&#xff0c;求最大的 ∣xi−xj∣min{∣yi∣,∣yj∣}|x_i-x_j|\times min\{|y_i|,|y_j|\}∣xi​−xj​∣min{∣yi​∣,∣yj​∣} 1≤n≤2106,−106≤xi≤106,−…

dfs剪枝:洛谷P2809 hzwer爱折纸

传送门 解析 dfs暴力枚举即可 这题的重点是如何剪枝 不难发现&#xff0c;随着不断处理&#xff0c;纸条只会越来越短&#xff0c;且所有数字总加和不变 我一开始想到了2个条件&#xff1a; 1.当前长度比理想纸条小&#xff0c;return&#xff1b; 2.总加和与理想纸条不等&a…

[译]聊聊C#中的泛型的使用

写在前面今天忙里偷闲在浏览外文的时候看到一篇讲C#中泛型的使用的文章&#xff0c;因此加上本人的理解以及四级没过的英语水平斗胆给大伙进行了翻译&#xff0c;当然在翻译的过程中发现了一些问题&#xff0c;因此也进行了纠正&#xff0c;当然&#xff0c;原文的地址我放在最…

P5405-[CTS2019]氪金手游【树形dp,容斥,数学期望】

前言 话说在LojLojLoj下了个数据发现这题的名字叫fgofgofgo 正题 题目链接:https://www.luogu.com.cn/problem/P5405 题目大意 nnn张卡的权值为1/2/31/2/31/2/3的概率权重分别是px,1/2/3p_{x,1/2/3}px,1/2/3​&#xff0c;然后按照权值每次获得一张未获得的卡&#xff0c;然后…

模板:线段树

文章目录引言思想模板建树单点修改 / 查询区间修改/查询总结练习引言 有一类题目:要求在区间上维护信息&#xff0c;比如带修改区间求和问题。考虑到枚举求和肯定会超时&#xff0c;我们可以通过一些数据结构来维护信息&#xff0c;例如线段树。 它功能强大&#xff0c;支持区…

Docker最全教程——从理论到实战(三)

容器是应用走向云端之后必然的发展趋势&#xff0c;因此笔者非常乐于和大家分享我们这段时间对容器的理解、心得和实践。本篇教程持续编写了2个星期左右&#xff0c;只是为了大家更好地了解、理解和消化这个技术&#xff0c;能够搭上这波车。你可以关注我们的公众号“magiccode…

高并发、低延迟之C#玩转CPU高速缓存(附示例)

写在前面好久没有写博客了&#xff0c;一直在不断地探索响应式DDD&#xff0c;又get到了很多新知识&#xff0c;解惑了很多老问题&#xff0c;最近读了Martin Fowler大师一篇非常精彩的博客The LMAX Architecture&#xff0c;里面有一个术语Mechanical Sympathy&#xff0c;姑且…

RMQ问题:与众不同(st表的高端应用)

解析 预处理 用pre[i]表示以i结尾的最长完美序列起始点&#xff0c;用last[i]表示数字i最后出现的位置 那么可以得到递推式&#xff1a; pre[i]max(pre[i-1],last[x[i]]1);也就是说这个pre要么是受前一位一样的限制&#xff0c;要么是受自己的限制 用f[i]表示以i结尾的最长完…

Docker最全教程——从理论到实战(四)

容器是应用走向云端之后必然的发展趋势&#xff0c;因此笔者非常乐于和大家分享我们这段时间对容器的理解、心得和实践。本篇教程持续编写了2个星期左右并且一直在完善、补充具体的细节和实践&#xff0c;预计全部完成需要1到2个月的时间。由于编写的过程中极其费时&#xff0c…

动态规划:openjudge 2.6-3532 最大上升子序列和 解题心得

传送门 题目描述 一个数的序列bi&#xff0c;当b1 < b2 < … < bS的时候&#xff0c;我们称这个序列是上升的。对于给定的一个序列(a1, a2, …,aN)&#xff0c;我们可以得到一些上升的子序列(ai1, ai2, …, aiK)&#xff0c;这里1 < i1 < i2 < … < iK…

边缘化搭建 DotNet Core 2.1 自动化发布和部署(下)

写在前面本篇文章是上一篇边缘化搭建 DotNet Core 2.1 自动化发布和部署(上)的后续操作&#xff0c;本文主要讲解如何开启Docker Remote API&#xff0c;开启Remote API后的权限安全问题。配置Jenkins构建项目&#xff0c;并在云服务器上构建成功。废话不多说&#xff0c;我们一…

边缘化搭建DotNet Core 2.1 自动化构建和部署环境(上)

写在前面写这篇文章的缘由是由于笔者的对新兴技术方向有所追求&#xff0c;但个人资产有限&#xff0c;只能容许购买一台阿里云低配1核2G服务器。服务器上搭建了 Centos7 & Docker & Jenkins & ASP.NET Core 2.0 自动化发布和部署 环境后牺牲了大部分性能。造成了一…

.NET Core实战项目之CMS 第六章 入门篇-Vue的快速入门及其使用

写在前面上面文章我给大家介绍了Dapper这个ORM框架的简单使用&#xff0c;大伙会用了嘛&#xff01;本来今天这篇文章是要讲Vue的快速入门的&#xff0c;原因是想在后面的文章中使用Vue进行这个CMS系统的后台管理界面的实现。但是奈何Vue实现的SPA有一定的门槛&#xff0c;不太…

不止代码:ybtoj-棋盘分割(二维区间dp)

题目描述 将一个8*8的棋盘进行如下分割&#xff1a;将原棋盘割下一块矩形棋盘并使剩下部分也是矩形&#xff0c;再将剩下的部分继续如此分割&#xff0c;这样割了n-1次后&#xff0c;连同最后剩下的矩形棋盘共有n块矩形棋盘。 (每次切割都只能沿着棋盘格子的边进行) 原棋盘上…

通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span

前言作为.net程序员&#xff0c;使用过指针&#xff0c;写过不安全代码吗&#xff1f;为什么要使用指针&#xff0c;什么时候需要使用它&#xff1f;如果能很好地回答这两个问题&#xff0c;那么就能很好地理解今天了主题了。C#构建了一个托管世界&#xff0c;在这个世界里&…

AC自动机:例题与机制详解

介绍 AC自动机是kmp算法和trie树的结合 大体就是做这样的题用&#xff1a; 可以发现&#xff0c;这题和trie树的区别是把多个单词往一篇文章匹配&#xff0c;而trie恰好相反 匹配的时候其实就是判断子串&#xff0c;所以又用到了kmp 定义失配指针nxt[i]&#xff1a;表示root到…

.NET Core实战项目之CMS 第七章 设计篇-用户权限极简设计全过程

写在前面这篇我们对用户权限进行极简设计并保留其扩展性。首先很感谢大家的阅读&#xff0c;前面六章我带着大家快速入门了ASP.NET Core、ASP.NET Core的启动过程源码解析及配置文件的加载过程源码解析并引入依赖注入的概念、Git的快速入门、Dapper的快速入门、Vue的快速入门。…

2021“MINIEYE杯”中国大学生算法设计超级联赛(5)Random Walk 2(推式子+矩阵逆+矩阵乘)

Random Walk 2 【2.4】Gauss-Jordan消元法求矩阵的逆 高斯消元求矩阵的逆&#xff0c;伴随单位矩阵一起消元即可。 [A,I]→[I,A−1][\text A,\text I]\to [\text I,\text A^{-1}][A,I]→[I,A−1] 移项变形&#xff0c;后就是个矩阵的逆&#xff0c;为啥赛时不写&#xff1f;&a…

参加胶东开发者技术大会有感

2015年的时候&#xff0c;也是在12月&#xff0c;我和Bob(https://www.cnblogs.com/nianming/)去北京参加了“全球架构师峰会”&#xff0c;在那次会议上&#xff0c;来自百度、腾讯、阿里巴巴、京东、美团、新浪微博、Twitter等公司的架构师、技术专家们分享了各自在架构方面的…

专题:数列信息传递问题转化为图论合点问题(ybtoj-数列询问+序列破解)

文章目录前言&#xff1a;一、数列询问&#xff08;取模&#xff09;解析代码二、序列破解&#xff08;奇偶性&#xff09;解析代码thanks for reading&#xff01;前言&#xff1a; 在一个数列a中&#xff0c;对于一个大区间A和组成它的两个小区间a&#xff0c;b&#xff1b;…