本篇只聚焦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
用户登陆阶段调用它来决定向用户显示什么,需要登陆?需要确认?需要跳转?