如何在 IdentityServer4 中创建自定义授权类型
Posted
技术标签:
【中文标题】如何在 IdentityServer4 中创建自定义授权类型【英文标题】:How to make a custom grant type in IdentityServer4 【发布时间】:2021-10-27 04:29:29 【问题描述】:我正在尝试使用 IdentityServer 实现自定义授权类型,但我迷路了。
我有多个应用程序已经使用 PKCE 登录到另一个 IdentityServer,它需要访问受另一个保护的多个 API。我怎样才能使它工作?我应该实现一个 IExtensionGrantValidator 并在保护 API 的那个中注册 IdentyServer 签名密钥吗?
【问题讨论】:
您认为为什么需要自定义授权类型? 因为我需要根据第一个令牌生成第二个令牌并修改声明 【参考方案1】:在 IdentityServer 实例之间共享密钥将允许您在需要来自另一个颁发者的令牌的 API 中使用来自颁发者的令牌。
实际上,您甚至不需要共享签名密钥,您可以使用不同的签名密钥并将一个实例的签名密钥作为验证密钥添加到另一个实例。
然后,当 API 想要在后端验证令牌时,它们会从 OIDC 提供者 (IdentityServer) 获取 openid 配置,并使用服务器广播的密钥验证 JWT 签名。
为了说明,IdS 演示应用定义了一个键
https://demo.identityserver.io/.well-known/openid-configuration/jwks。当您使用AddValidationKey
添加多个验证密钥时,您将在.../jwks
元数据中看到所有这些密钥。然后应用程序将使用所有这些令牌进行验证。
// in instance A
services.AddIdentityServer()
.AddSigningCredential("CN=signing key for instance A")
.AddValidationKey("CN=signing key for instance B")
// in instance B
services.AddIdentityServer()
.AddSigningCredential("CN=signing key for instance B")
.AddValidationKey("CN=signing key for instance A")
参考文献
http://docs.identityserver.io/en/latest/topics/crypto.html#signing-key-rollover https://brockallen.com/2019/08/09/identityserver-and-signing-key-rotation/【讨论】:
非常感谢!我按照你说的做了。如果我理解正确,我根本不需要 IExtensionGrantValidator 验证器?以上是关于如何在 IdentityServer4 中创建自定义授权类型的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 TypedRowControllerType 在 Eureka 4.3 中创建自定义演示者行?
如何在 IdentityServer4 中添加自定义声明以访问令牌? [关闭]
如何在 Firebase 中创建基于角色的访问控制或自定义声明