.NET Core-统一认证平台之IdentityServer4源码分析(8)

一、Ids4文档及源码

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

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

二、源码整体分析

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

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

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

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

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

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

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

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

  • 输出调试相关信息提醒

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1、执行授权

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

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

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

获取路由处理器

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

三、获取Token执行分析

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

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

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

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

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

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

执行步骤如下:

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

  2. 验证客户端授权

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

    ClientSecretValidator.cs

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

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

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

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

验证请求的信息是否有误

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

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

1、创建生成的结果

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

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

1、写入日志记录

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

2、输出最终结果

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


未经允许不得转载:996ICU » .NET Core-统一认证平台之IdentityServer4源码分析(8)

赞 (0) 打赏