我们使用 IdentityServer 进行身份验证,并使用 JwtSecurityTokenHandler ValidateToken 验证访问 token 。这曾经工作正常,但在我们将客户端应用程序升级到 ASP.NET Core 1.0 RTM(来自 RC1)后,验证失败。收到的错误是:
IDX10501: Signature validation failed. Unable to match 'kid'
当我查看所用证书的 KeyID 和 token 的 child 时,我可以看到它们是不同的。我检查了 IdentityServer jwks-endpoint 以检查我是否拥有正确的证书,并注意到 Kid 和证书 key ID 也与该端点不同。据我了解,他们应该是一样的?
由于证书、 token 和 IdentityServer 仍然相同并且仅升级了客户端应用程序核心,因此任何想法为什么在升级期间代码会损坏。
编辑(更多信息)
我怀疑 ValidateIssuerSigningKey 默认情况下为 false 并且该 key 之前甚至没有经过验证(因此它正在工作)。现在似乎 ValidateIssuerSigningKey 被忽略了(作为不好的做法?),因此验证失败。
解决方法/修复
通过手动设置 IssuerSigningKeyResolver 并明确提供用于验证的 key ,可以修复问题并验证通过。不确定解决方法有多好以及为什么默认设置不起作用,但至少我现在可以继续。
简化代码...
new JwtSecurityTokenHandler().ValidateToken(authTokens.AccessToken,
new TokenValidationParameters()
{
IssuerSigningKeys = keys,
ValidAudience = audience,
ValidIssuer = issuer,
IssuerSigningKeyResolver = (arbitrarily, declaring, these, parameters) => new List<X509SecurityKey> { securityKey }
}, out securityToken);
最佳答案
客户端和 API 应该引用相同的 IdentityServer 实例。我们在 Azure 中运行 IdentityServerHost,它有不同的插槽(主和暂存)和两个应用程序不一致地引用不同的插槽。客户端收到由 IdSrv-main 提供者颁发的访问 token 并将其传递给 API,该 API 期望它来自不同的提供者 IdSrv-staging。 API 验证它并返回错误。
问题是错误并没有暗示问题的实际原因。 MS 应该提供更详细的错误信息来帮助调试。
当前的错误消息不足以确定原因。
关于certificate - 无法使用 IdentityServer 验证 AccessToken,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38239261/