无法使用IdentityServer验证AccessToken

Ant*_*nen 5 certificate access-token identityserver3

我们使用IdentityServer进行身份验证,我们使用JwtSecurityTokenHandler ValidateToken验证访问令牌.这曾经工作正常,但在我们将客户端应用程序升级到ASP.NET Core 1.0 RTM(来自RC1)后,验证失败.收到的错误是:

IDX10501: Signature validation failed. Unable to match 'kid'
Run Code Online (Sandbox Code Playgroud)

当我查看使用过的证书的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);
Run Code Online (Sandbox Code Playgroud)

MiF*_*vil 2

客户端和API应该引用IdentityServer的同一个实例。我们在 Azure 中运行 IdentityServerHost,它具有不同的插槽(主插槽和临时插槽),并且两个应用程序不一致地引用不同的插槽。客户端收到由 IdSrv 主提供商颁发的访问令牌并将其传递给 API,该 API 期望它来自不同的提供商 IdSrv-staging。API 对其进行了验证并返回了错误。

问题是该错误没有提示问题的实际原因。MS 应该提供更详细的错误消息以帮助调试。当前的错误消息不足以确定原因。