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