certificate - 无法使用 IdentityServer 验证 AccessToken

标签 certificate access-token identityserver3

我们使用 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/

相关文章:

c# - IdentityServer4 刷新 token 为空

c# - 使用 Thinktecture IdentityServer3 进行身份验证/授权 native Android 应用程序的正确方法是什么

cookies - 如何为客户端 cookie 设置到期日期?

angular - 有没有人为 IdentityServer 3/4 创建任何 Angular2 身份验证包装类?

clickonce - 如何让域 Controller 给我一个 ClickOnce 证书

facebook-graph-api - Oauth 2.0 无法从 signed_request 'code' 值中获取访问 token

来自 SCEP 请求的 Java PKIHeader

authentication - 什么是签名认证 token ?

azure - 我们可以在 Azure 中的哪里存储公钥/私钥对?

java - 通过 HTTPS 使用 HttpClient 信任所有证书