【问题标题】:Google token verification call deadlocked?谷歌令牌验证调用陷入僵局?
【发布时间】:2017-12-11 02:23:26
【问题描述】:

我有一个使用 google auth 验证 Google id 令牌的 C# 后端控制器方法。它在部署到我的测试服务器后开始工作,但过了一段时间,它遇到了死锁情况(我相信)。没有错误,它只是挂在 VerifyGoogleToken 上。

using Google.Apis.Auth;
using Google.Apis.Auth.OAuth2;

    [HttpPost]
    public async Task<string> VerifyGoogleToken(string Token)
    {
        var verifyUser = Task.Run(() => VerifyToken(Token).Result);
        await Task.WhenAll(verifyUser);
        string returnValue = verifyUser.Result.ToString();
        return returnValue;
    }

    private async Task<string> VerifyToken(string Token)
    {
        string ReturnValue = "InvalidToken";
        GoogleJsonWebSignature.Payload payload = await GoogleJsonWebSignature.ValidateAsync(Token);
        if (payload.HostedDomain == "mydomain.com" && payload.EmailVerified == true && payload.Audience.ToString() == ClientID && (payload.Issuer == "accounts.google.com" || payload.Issuer == "https://accounts.google.com"))
        {
            ReturnValue = "ValidToken";
        }
        return ReturnValue;
    }

我也试过这个:

[HttpPost]
public async Task<string> VerifyGoogleToken(string Token)
{
    string returnValue = await VerifyToken(Token)
    return returnValue;
}

private async Task<string> VerifyToken(string Token)
{
    string ReturnValue = "InvalidToken";
    GoogleJsonWebSignature.Payload payload = await GoogleJsonWebSignature.ValidateAsync(Token);
    if (payload.HostedDomain == "mydomain.com" && payload.EmailVerified == true && payload.Audience.ToString() == ClientID && (payload.Issuer == "accounts.google.com" || payload.Issuer == "https://accounts.google.com"))
    {
        ReturnValue = "ValidToken";
    }
    return ReturnValue;
}

还有这个:

[HttpPost]
public string VerifyGoogleToken(string Token)
{
    string returnValue = VerifyToken(Token);
    return returnValue;
}

private async Task<string> VerifyToken(string Token)
{
    string ReturnValue = "InvalidToken";
    GoogleJsonWebSignature.Payload payload = await GoogleJsonWebSignature.ValidateAsync(Token);
    if (payload.HostedDomain == "mydomain.com" && payload.EmailVerified == true && payload.Audience.ToString() == ClientID && (payload.Issuer == "accounts.google.com" || payload.Issuer == "https://accounts.google.com"))
    {
        ReturnValue = "ValidToken";
    }
    return ReturnValue;
}

到目前为止没有任何效果。

感谢任何帮助。

【问题讨论】:

  • 只是猜测您在调试时遇到了麻烦,因为异步调用 ValidateAsync 可能失败或挂起。您可以使用 Sync 方法调用进行测试吗?
  • 我认为该方法没有同步版本(来自谷歌)。或者您是在问我是否尝试使用 Sync 函数调用包装 Async 方法?
  • 是的。仅用于调试目的。
  • 并且(显然)不要等待异步调用(对谷歌)
  • 运气好吗?你能调试吗?

标签: c# asp.net async-await google-identity


【解决方案1】:

我相信您可以调用验证的次数是有限制的,但我并不完全知道这个限制。我的代码过去每 30 秒调用一次验证,以执行诸如获取用户 ID/电子邮件等操作。此设置在几个小时后停止工作。由于我重写了代码,每个连接只调用了几次验证,因此验证一直正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-14
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    相关资源
    最近更新 更多