【问题标题】:Validating Google ID tokens in C#在 C# 中验证 Google ID 令牌
【发布时间】:2013-06-14 17:35:58
【问题描述】:

我需要在我的 ASP.NET Web api 上验证从移动设备传递的 Google ID 令牌。

Google 有一些示例代码 here,但它依赖于仅 .Net 4.5 的 JWT NuGet 包(我使用的是 C#/.Net 4.0)。有没有人知道任何没有这些软件包的样本或自己实现了这一点?这个包的使用让我很难弄清楚没有它我需要做什么。

【问题讨论】:

  • 找到什么了吗?我也想用 C# 离线做,因为有时谷歌的服务器响应很慢。

标签: c# .net authentication google-plus


【解决方案1】:

根据这个 github issue,您现在可以使用 GoogleJsonWebSignature.ValidateAsync 方法来验证 Google 签名的 JWT。只需将idToken 字符串传递给方法即可。

var validPayload = await GoogleJsonWebSignature.ValidateAsync(idToken);
Assert.NotNull(validPayload);

如果不是有效的,它将返回null。

注意,要使用这种方法,你需要先安装Google.Apis.Authnuget。

【讨论】:

  • 你知道怎么解码,所以我可以得到用户ID吗?
  • GoogleJsonWebSignature.ValidateAsync 方法返回带有令牌详细信息的 Payload 对象 - 例如它可以包括电子邮件、FamilyName、GivenName 等属性
【解决方案2】:

挑战是验证 ID 令牌中的 JWT 证书。目前我知道没有一个库可以做到这一点,它不需要 .Net 4.5,在 .NET 4.0 中有 JWT 验证解决方案之前,不会有一个简单的解决方案。

但是,如果您有访问令牌,则可以考虑使用 oauth2.tokeninfo 执行验证。要使用令牌信息执行基本验证,您可以执行以下操作:

// Use Tokeninfo to validate the user and the client.
var tokeninfo_request = new Oauth2Service().Tokeninfo();
tokeninfo_request.Access_token = _authState.AccessToken;
var tokeninfo = tokeninfo_request.Fetch();
if (userid == tokeninfo.User_id
    && tokeninfo.Issued_to == CLIENT_ID)
{
    // Basic validation succeeded
}
else
{
    // The credentials did not match.
}

从 Google OAuth2 API 返回的信息会告诉您有关特定令牌的更多信息,例如它所颁发的客户端 ID 以及它的到期时间。

注意您不应传递访问令牌,而应在交换一次性代码以检索访问令牌后进行此检查。

【讨论】:

  • 我实际上并没有传递访问令牌,只是传递了 id 令牌。我只需要对用户进行身份验证,不需要调用任何 Google api。我认为传递访问令牌是不好的做法,有没有办法只使用 id 令牌来做到这一点?谢谢
  • 我将继续寻找一种不使用 .NET 4.5 的方法来实现这一点,如果有一个适用于 4.0 及更高版本的解决方案将是理想的。此外,为了验证访问令牌,您要做的是使用一次性代码并将其交换为访问令牌,而不是传递访问令牌。
【解决方案3】:

ClientId 也需要传递,它应该从 Google API 控制台设置。如果只传递 TokenId,GoogleJsonWebSignature 会抛出错误。此答案是@edmundpie 答案的补充

var settings = new GoogleJsonWebSignature.ValidationSettings()
{
 Audience = new List<string>() { "[Placeholder for Client Id].apps.googleusercontent.com" }
};

var validPayload = await GoogleJsonWebSignature.ValidateAsync(model.ExternalTokenId, settings);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-27
    • 2020-07-25
    • 1970-01-01
    • 2021-07-19
    • 2016-08-11
    • 2015-06-27
    • 2015-10-02
    相关资源
    最近更新 更多