无法验证IdentityServer的AccessToken

6
我们正在使用IdentityServer进行身份验证,并且我们正在使用JwtSecurityTokenHandler ValidateToken验证访问令牌。这以前可以正常工作,但是在将客户端应用程序升级到ASP.NET Core 1.0 RTM(从RC1)之后,验证失败了。收到的错误如下:
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);

1
请更详细地描述您正在运行的内容以及您更新了什么。可能与https://github.com/IdentityServer/IdentityServer3/issues/3040有关。 - leastprivilege
1
听起来像是同样的问题。无论如何,我通过手动设置IssuerSigningKeyResolver并明确给出用于验证的密钥来解决了它。我仍然想知道为什么默认设置不起作用,但至少我通过这个修复方法让它工作了。 - Antti Simonen
3
我们遇到了相同的错误,但问题在于颁发者和授权网址的大小写不同。https://myserver/sts 和 https://myserver/Sts。 - Larsi
1个回答

2
客户端和API应该引用同一个IdentityServer实例。我们正在Azure中运行IdentityServerHost,它有不同的插槽(主要和暂存),并且两个应用程序引用了不同的插槽。客户端收到了由IdSrv-main提供程序发出的访问令牌,并将其传递给API,但API却期望从不同的提供程序IdSrv-staging获取。API验证了访问令牌并返回错误。
问题在于错误没有提示实际问题的原因。微软应该提供更详细的错误消息来帮助调试。当前的错误消息不足以确定原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接