上篇文章我介绍了如何在网关上实现客户端自定义限流功能,基本完成了关于网关的一些自定义扩展需求,后面几篇将介绍基于
IdentityServer4(后面简称Ids4)
的认证相关知识,在具体介绍ids4
实现我们统一认证的相关功能前,我们首先需要分析下Ids4
源码,便于我们彻底掌握认证的原理以及后续的扩展需求。.netcore项目实战交流群(637326624),有兴趣的朋友可以在群里交流讨论。
一、Ids4文档及源码
文档地址 http://docs.identityserver.io/en/latest/
Github源码地址 https://github.com/IdentityServer/IdentityServer4
二、源码整体分析
【工欲善其事,必先利其器,器欲尽其能,必先得其法】
在我们使用Ids4
前我们需要了解它的运行原理和实现方式,这样实际生产环境中才能安心使用,即使遇到问题也可以很快解决,如需要对认证进行扩展,也可自行编码实现。
源码分析第一步就是要找到Ids4
的中间件是如何运行的,所以需要定位到中间价应用位置app.UseIdentityServer();
,查看到详细的代码如下。
通过上面的源码,我们知道整体流程分为这5步实现。接着我们分析下每一步都做了哪些操作呢?
1、app.Validate()为我们做了哪些工作?
校验
IPersistedGrantStore、IClientStore、IResourceStore
是否已经注入?验证
IdentityServerOptions
配置信息是否都配置完整输出调试相关信息提醒
详细的实现代码如上所以,非常清晰明了,这时候有人肯定会问这些相关的信息时从哪来的呢?这块我们会在后面讲解。
2、BaseUrlMiddleware中间件实现了什么功能?
源码如下,就是从配置信息里校验是否设置了PublicOrigin
原始实例地址,如果设置了修改下请求的Scheme
和Host
,最后设置IdentityServerBasePath
地址信息,然后把请求转到下一个路由。
这里源码非常简单,就是设置了后期要处理的一些关于请求地址信息。那这个中间件有什么作用呢?
就是设置认证的通用地址,当我们访问认证服务配置地址http://localhost:5000/.well-known/openid-configuration
的时候您会发现,您设置的PublicOrigin
会自定应用到所有的配置信息前缀,比如设置option.PublicOrigin = "http://www.baidu.com";
,显示的json
代码如下。
可能还有些朋友觉得奇怪,这有什么用啊?其实不然,试想下如果您部署的认证服务器是由多台组成,那么可以设置这个地址为负载均衡地址,这样访问每台认证服务器的配置信息,返回的负载均衡的地址,而负载均衡真正路由到的地址是内网地址,每一个实例内网地址都不一样,这样就可以负载生效,后续的文章会介绍配合Consul
实现自动的服务发现和注册,达到动态扩展认证节点功能。
可能表述的不太清楚,可以先试着理解下,因为后续篇幅有介绍负载均衡案例会讲到实际应用。
3、app.ConfigureCors(); 做了什么操作?
其实这个从字面意思就可以看出来,是配置跨域访问的中间件,源码就是应用配置的跨域策略。
很简单吧,至于什么是跨域,可自行查阅相关文档,由于篇幅有效,这里不详细解释。
4、app.UseAuthentication();做了什么操作?
就是启用了默认的认证中间件,然后在相关的控制器增加[Authorize]
属性标记即可完成认证操作,由于本篇是介绍的Ids4
的源码,所以关于非Ids4
部分后续有需求再详细介绍实现原理。
5、IdentityServerMiddleware中间件做了什么操作?
这也是Ids4
的核心中间件,通过源码分析,哎呀!好简单啊,我要一口气写100个牛逼中间件。
哈哈,我当时也是这么想的,难道真的这么简单吗?接着往下分析,让我们彻底明白Ids4
是怎么运行的。
第一步从本地提取授权记录,就是如果之前授权过,直接提取授权到请求上下文。说起来是一句话,但是实现起来还是比较多步骤的,我简单描述下整个流程如下。
1、执行授权
如果发现本地未授权时,获取对应的授权处理器,然后执行授权,看是否授权成功,如果授权成功,赋值相关的信息,常见的应用就是自动登录的实现。
比如用户U访问A系统信息,自动跳转到S认证系统进行认证,认证后调回A系统正常访问,这时候如果用户U访问B系统(B系统也是S统一认证的),B系统会自动跳转到S认证系统进行认证,比如跳转到
/login
页面,这时候通过检测发现用户U已经经过认证,可以直接提取认证的所有信息,然后跳转到系统B,实现了自动登录过程。
获取路由处理器
其实这个功能就是拦截请求,获取对应的请求的处理器,那它是如何实现的呢?
IEndpointRouter
是这个接口专门负责处理的,那这个方法的实现方式是什么呢?可以右键-转到实现
,我们可以找到EndpointRouter
方法,详细代码如下。
源码功能我做了简单的讲解,发现就是提取对应路由处理器,然后转换成IEndpointHandler
接口,所有的处理器都会实现这个接口。但是IEnumerable<Endpoint>
记录是从哪里来的呢?而且为什么可以获取到指定的处理器,可以查看如下代码,原来都注入到默认的路由处理方法里。
通过现在分析,我们知道了路由查找方法的原理了,以后我们想增加自定义的拦截器也知道从哪里下手了。
执行路由过程并返回结果
有了这些基础知识后,就可以很好的理解
var result = await endpoint.ProcessAsync(context);
这句话了,其实业务逻辑还是在自己的处理器里,但是可以通过调用接口方法实现,是不是非常优雅呢?为了更进一步理解,我们就上面列出的路由发现地址(
http://localhost:5000/.well-known/openid-configuration
)为例,讲解下运行过程。通过注入方法可以发现,路由发现的处理器如下所示。
可以请求的地址会被拦截,然后进行处理。
它的详细代码如下,跟分析的一样是实现了IEndpointHandler
接口。
通过上面代码说明,可以发现通过4步完成了整个解析过程,然后输出最终结果,终止管道继续往下进行。
路由发现的具体实现代码如下,就是把结果转换成Json格式输出,然后就得到了我们想要的结果。
到此完整的路由发现功能及实现了,其实这个实现比较简单,因为没有涉及太多其他关联的东西,像获取Token和就相对复杂一点,然后分析方式一样。
6、继续运行下一个中间件
有了上面的分析,我们可以知道整个授权的流程,所有在我们使用Ids4
时需要注意中间件的执行顺序,针对需要授权后才能继续操作的中间件需要放到Ids4
中间件后面。
三、获取Token执行分析
为什么把这块单独列出来呢?因为后续很多扩展和应用都是基础Token获取的流程,所以有必要单独把这块拿出来进行讲解。有了前面整体的分析,现在应该直接这块源码是从哪里看了,没错就是下面这句。
builder.AddEndpoint<TokenEndpoint>(EndpointNames.Token, ProtocolRoutePaths.Token.EnsureLeadingSlash());
他的执行过程是TokenEndpoint
,所以我们重点来分析下这个是怎么实现这么复杂的获取Token过程的,首先放源码。
执行步骤如下:
验证是否为Post请求且使用form-data方式传递参数(直接看代码即可)
验证客户端授权
详细的验证流程代码和说明如下。
ClientSecretValidator.cs
验证请求的信息是否有误
由于代码太多,只列出TokenRequestValidator.cs
部分核心代码如下,
1、创建生成的结果
TokenResponseGenerator.cs
根据不同的认证方式执行不同的创建方法,由于篇幅有限,每一个是如何创建的可以自行查看源码。
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