【发布时间】:2021-11-11 05:07:05
【问题描述】:
我的公司需要一个带有外部身份提供商的 SSO 解决方案,所以我查阅了官方文档,发现:https://identityserver4.readthedocs.io/en/latest/topics/extension_grants.html
我实现的自定义流程正在运行,我能够根据来自外部提供商的传入 JWT 令牌生成令牌。我面临的问题是,在实现接口 ITokenValidator 并将其添加到 DI(如文档页面中所述)之后,每个标准流程都开始使用该自定义验证器,因此所有其他应用程序都直接连接到我的 IDS4解决方案在登录阶段抛出“签名验证失败。无法匹配密钥”类型的错误。
我立即认为问题出在我的自定义验证器上,因为在该流程中我使用公钥来验证令牌。发现这一点后,我从 Startup 类中删除了自定义验证器的依赖注入行,并且我的所有标准流程都可以再次工作,而我的自定义流程不是因为它当时使用的是默认令牌验证器(而且还不够好)出于我的目的)。
我的猜测是,通过将自定义验证器添加到 DI,它会覆盖所有其他标准流程应该使用的默认验证器。
我以这种方式为 ExtensionGrant 添加了 DI
services.AddIdentityServer((identityServerOptions) =>
{
identityServerOptions.InputLengthRestrictions.Scope = scopeInputLength;
identityServerOptions.Events.RaiseErrorEvents = true;
identityServerOptions.Events.RaiseFailureEvents = true;
identityServerOptions.Events.RaiseSuccessEvents = true;
identityServerOptions.Events.RaiseInformationEvents = true;
})
.AddSigningCredential(signatureCertificate)
.AddResourceOwnerValidator<ResourceOwnerPasswordValidator>()
.AddClientStore<ClientStore>()
.AddProfileService<ProfileService>()
.AddExtensionGrantValidator<DelegationGrantValidator>()
// This one
.AddExtensionGrantValidator<CustomGrantValidator>()
.AddResourceStore<ResourceStore>();
对于令牌验证器以这种方式
services.AddTransient<ITokenValidator, CustomValidator>();
编辑:如果我不使用依赖注入而是这样做
await new CustomValidator().ValidateAccessTokenAsync(userToken);
默认和自定义授权有效。我是否遗漏了一些东西,比如让应用程序访问公钥来解密在这个流程中传递的令牌?
有解决办法吗?也许我应该为令牌验证器实现不同的接口?我找不到更多关于此的文档。请帮我解决问题
【问题讨论】:
标签: c# dependency-injection identityserver4 access-token