带有 .NET JSON Web 令牌处理程序的 Google 身份工具包令牌验证异常

Posted

技术标签:

【中文标题】带有 .NET JSON Web 令牌处理程序的 Google 身份工具包令牌验证异常【英文标题】:Google identiy toolkit token validation exception with .NET JSON web token handler 【发布时间】:2016-01-24 08:37:11 【问题描述】:

我正在尝试将 GIT 集成到我的网站中。我已成功实施该工具包,并希望使用设置期间提供的 *.p12 证书验证从 Google API 发送的 JWT。

异常详细信息:System.IdentityModel.SignatureVerificationFailedException:IDX10501:签名验证失败。尝试的密钥:'System.IdentityModel.Tokens.X509SecurityKey'。

收到的 JSON Web 令牌: 令牌:'"alg":"RS256","kid":"qwYevA"。"iss":"https://identitytoolkit.google.com/","aud":"238895676270-i8o5fe2poogs83nki8jl5tgtfm7h9n5l.apps.googleusercontent.com","iat ":1445739256,"exp":1446948856,"user_id":"","email":"","provider_id":"google.com","verified":true,"display_name":""'

 var signingToken = new X509SecurityToken(new X509Certificate2(fileName, "notasecret"));
        TokenValidationParameters validationParameters =

                              new TokenValidationParameters()

                              

                                  IssuerSigningKey = new X509SecurityKey(new X509Certificate2(fileName, "notasecret")),
                                  ValidAudience = "238895676270-i8o5fe2poogs83nki8jl5tgtfm7h9n5l.apps.googleusercontent.com",
                                  ValidIssuer = "https://identitytoolkit.google.com/",
                                  IssuerSigningKeyResolver = (token, a, ski, tvp) =>  return new X509SecurityKey(new X509Certificate2(fileName, "notasecret")); ,
                                  IssuerSigningToken = signingToken,

    ;
        SecurityToken st;

        var result = tokenHandler.ValidateToken((Request.Cookies["gtoken"]).Value, validationParameters, out st);

【问题讨论】:

【参考方案1】:

Identity Toolkit 生成的 JWT 由 Identity Toolkit 自己的 RSA 私钥签名,而不是您在设置期间下载的 .p12。

您需要从 https://www.googleapis.com/identitytoolkit/v3/relyingparty/publicKeys?key=YOUR_SERVER_API_KEY 下载当前有效的 Identity Toolkit X509 公共证书,在您收到的 JWT 中为“孩子”选择证书,并使用该证书构建 X509Certificate2。

SERVER_API_KEY 可以在您创建 OAuth2 客户端的 Google Developers Console 中生成。

【讨论】:

谢谢金。您能否详细说明如何在 .NET 中使用 publicKeys 创建证书?文档中提到的 *.p12 有什么用?文档中的每个示例似乎都使用 *.p12。 我不是 .NET 方面的专家,但您可能可以使用 new X509Certificate2(Convert.FromBase64String(certString)) 之类的东西,其中可以如上所述下载 certString。 .p12 文件包含您自己的私钥,当您对 Google 进行 API 调用时,您可以使用它来证明您的开发者帐户。其他人不知道您的私钥,因此他们无法在 Google 访问您的项目数据。 Google Identity Toolkit 公共证书用于另一个方向 - 您的服务器需要验证 IdToken 确实是由 Google Identity Toolkit 颁发的。 知道了!对于未来/未来的任何人,证书从 publicKeys 方法上的 GET 请求传递的方式需要转换为 FromBase64String 方法的有效文本(因为它是原始发送的)。在我的情况下,我将 \n 混淆为证书中的有效字符。谢谢金。

以上是关于带有 .NET JSON Web 令牌处理程序的 Google 身份工具包令牌验证异常的主要内容,如果未能解决你的问题,请参考以下文章

带有 PHP 和 Angular.js 的 JWT(JSON Web 令牌)

对 Bearer 令牌使用 JSON Web 令牌和 Firestore 支持

.net Web API。如何从访问令牌中检索用户属性(用户 ID)?基于当前用户/令牌的请求处理程序代码

带有 OWIN 的 webapi 中的复杂 JSON Web 令牌数组

无法使用 .NET 验证 JSON Web 令牌 - 密钥太短

使用 angularjs ui 时节点/Angularjs 应用程序未接收 JSON Web 令牌