变形精怪

树有年轮,人有皱纹

导航

ids4-startup

Posted on 2021-02-18 20:01  变形精怪  阅读(181)  评论(0编辑  收藏  举报

https://stackoverflow.com/questions/28418360/jwt-json-web-token-audience-aud-versus-client-id-whats-the-difference

 

本篇只聚焦ids的启动配置的流程以及关联的核心接口和类,对应官方文档https://identityserver4.readthedocs.io/en/latest/topics/startup.html

启动配置宏观上说做了两件事:注册ids运行过程中需要使用到的相关服务、注册ids终结点中间件

注册服务

在startup中

public void ConfigureServices(IServiceCollection services)
{
    var builder = services.AddIdentityServer();
}
  • ids中定义了很多接口,以实现可扩展性,这些接口都有默认实现,通常默认实现还配有对应的option对象,这些接口、实现和对应的option都在这里注册到ioc容器
  • 大部分情况下我们在这里对各组件的option对象进行配置就可以了
  • 特殊情况下我们需要自定义实现某些接口,然后在这里替换ids注册的接口实现

 

 

 

Token验证器ITokenValidator

它提供对AccessToken和IdentityToken的验证的两个方法,默认实现:TokenValidator

这俩方法都会用到IKeyMaterialService.GetValidationKeysAsync

验证过程中会使用到key材料,这个key材料的管理由IKeyMaterialService提供,啥是key材料?往后看

 

 

密钥材料管理服务IKeyMaterialService

ids4运行过程中会使用到各种密钥,比如token的加解密,jwt签名验证等,这些密码在ids称为 key材料。可以简单理解为:key材料 = 密钥 + 签名算法

主要又分为两种key材料:SigningCredential、ValidationKeys,前者主要是各种地方的签名用(经过查看源码只是用来生成各种hash值),后者只是用来加解密token的,上面说了就是identityToken和accessToken

由于签名是比较简单的逻辑,所以不想token的处理还专门定义了token验证器,所有需要签名的地方是直接引用IKeyMaterialService的

 

 

由IKeyMaterialService统一管理密钥,默认实现类是DefaultKeyMaterialService,它只是提供密钥的业务逻辑管理

密钥的存储时通过对应IStorage提供的,SigningCredential、ValidationKeys分别有自己的Storage

 

 

中间件的执行

EndPointRouter 路由找到EndPoint,并执行它,

请求code

通过code请求accessToken

注销等 都是不同的endpoint

 

public void ConfigureServices(IServiceCollection services)
{
var builder = services.AddIdentityServer();
}

ids运行过程中需要的服务由这个方法统一注册,具体注册了哪些核心服务后面再慢慢补充

 

 

key材料

所谓的key材料 = 密钥 + 加密算法

AddSigningCredential

生成token时会使用这里的密钥信息进行加密,猜想请求identity资源和api资源时验证token时也会使用到这个密钥。

AddDeveloperSigningCredential

开发时在根目录中创建的零时密钥

AddValidationKey

在jwttoken验证签名时会使用到的密钥,通过源码查客户端注销时会去请求ids4服务器,会携带参数,那些参数的验证签名也是用的这个

In-Memory configuration stores

启动阶段从硬编码、配置、数据库获取api资源、identity资源、client配置。这个其实也可以用于生产环境

AddInMemoryClients AddInMemoryIdentityResources AddInMemoryApiResources

Test stores

AddTestUsers 这个通常就不建议在生产环境使用了

Additional services

ids4中间件处理过程中会使用到各种服务,而这些服务就是扩展点,很多都可以替换

AddExtensionGrantValidator

TokenEndpoint负责处理code的获取accesstoken identitytoken的获取,其中一个重要的步骤就是验证请求,会根据不太的授权模式,如:AuthorizationCode、ClientCredentials、Password、RefreshToken做不同的授权检查,AddExtensionGrantValidator就是表示不属于以上类型的自定义授权类型,所以可以通过自定义的授权检查器来实现更多的授权流程

AddSecretParser

机密解析器,总的来说就是从请求中解析得到机密信息,提取到的结果用ParsedSecret表示。比如从请求中获取clientid,securet等信息

AddSecretValidator

上面得到client信息,下面就是验证,设计方式与上面类型

AddResourceOwnerValidator

资源所有者模式中用来验证用户密码的

AddProfileService

添加用于连接到自定义用户配置文件存储的IProfileService实现。 获取用户Profile时调用的,默认实现DefaultProfileService是直接从身份验证的cookie中获取申明然后响应给用户

AddAuthorizeInteractionResponseGenerator

用户登陆阶段调用它来决定向用户显示什么,需要登陆?需要确认?需要跳转?