我们正在使用IdentityServer进行身份验证,并且我们正在使用JwtSecurityTokenHandler ValidateToken验证访问令牌。这以前可以正常工作,但是在将客户端应用程序升级到ASP.NET Core 1.0 RTM(从RC1)之后,验证失败了。收到的错误如下:
当我查看使用的证书的KeyID和令牌的kid时,我发现它们不同。我检查了IdentityServer jwks-endpoint以确保我有正确的证书,并注意到该端点中的kid和证书key id与之不同。据我所知,它们应该是相同的?
任何想法为什么代码在升级期间中断,因为证书、令牌和IdentityServer仍然相同,只有客户端应用程序核心被升级。
编辑(更多信息): 我怀疑ValidateIssuerSigningKey默认为false,并且在验证密钥之前甚至没有进行过验证(因此它可以工作)。现在似乎忽略了ValidateIssuerSigningKey(作为不良实践?),因此验证失败。
解决方法/修复: 通过手动设置IssuerSigningKeyResolver并显式地提供用于验证的密钥,可以解决问题并通过验证。不确定解决方法有多好,以及为什么默认值不起作用,但至少现在我可以继续前进。
简化代码...
IDX10501: Signature validation failed. Unable to match 'kid'
当我查看使用的证书的KeyID和令牌的kid时,我发现它们不同。我检查了IdentityServer jwks-endpoint以确保我有正确的证书,并注意到该端点中的kid和证书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);