Вызов проверки токена Google заблокирован?

У меня есть метод внутреннего контроллера С#, который проверяет токен идентификатора Google с помощью аутентификации Google. Сначала он работает после развертывания на моем тестовом сервере, но через некоторое время он заходит в тупиковую ситуацию (я полагаю). Ошибки нет, просто висит на 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;
}

Пока ничего не получилось.

Любая помощь приветствуется.


person Wen W    schedule 11.12.2017    source источник
comment
Просто предполагаю, что у вас проблемы с отладкой из-за асинхронного вызова ValidateAsync, который может дать сбой или зависнуть. Можете ли вы протестировать вызов метода Sync?   -  person DaniDev    schedule 14.12.2017
comment
Я не думаю, что есть версия метода синхронизации (это от Google). Или вы спрашиваете, пытался ли я обернуть метод Async вызовом функции Sync?   -  person Wen W    schedule 15.12.2017
comment
да. только для целей отладки.   -  person DaniDev    schedule 15.12.2017
comment
и (очевидно) не ждать асинхронного вызова (в Google)   -  person DaniDev    schedule 15.12.2017
comment
При удаче? ты смог отладить?   -  person DaniDev    schedule 16.12.2017
comment
Я не очень хорошо разбираюсь в том, как синхронизировать асинхронную функцию, но разве код не находится в разделе Также это: это?   -  person Wen W    schedule 17.12.2017
comment
Извините, не заметил вашего вопроса до сих пор. Чтобы ответить на ваш вопрос: Да, в вашей (также этой) попытке вы не асинхронизировали вызывающий метод VerifyGoogleToken. Можете ли вы попробовать сделать то же самое для VerifyToken. Таким образом, вы можете следить за потоком и посмотреть, извлекаете ли вы полезную нагрузку.   -  person DaniDev    schedule 19.12.2017
comment
Насколько мне известно, не существует синхронизированной версии GoogleJsonWebSignature.ValidateAsync, поэтому нет, я не могу отменить ее асинхронность.   -  person Wen W    schedule 25.12.2017
comment
Что касается запуска асинхронного метода синхронно (синхронный контекст), вы можете использовать Task.Run(() =› ........), пожалуйста, прочитайте следующее для более глубокого понимания: stackoverflow.com/questions/22628087/   -  person DaniDev    schedule 28.12.2017
comment
Что еще более важно, я провел для вас небольшое исследование и нашел следующее: stackoverflow.com/questions/44600214/, поскольку я не очень хорошо знаком с GoogleJsonWebSignature.ValidateAsync, и у вас нет ошибки, на которую можно ссылаться, я не уверен, что это ваша проблема, но она предполагает, что вы не предоставили/использовали пользователя контекста в дополнение к токену (имеет смысл). это также предоставляет еще один отличный ресурс для тестирования вашего асинхронного кода: msdn.microsoft.com/ en-us/magazine/dn818493.aspx   -  person DaniDev    schedule 28.12.2017
comment
Спасибо. Я уже прочитал и попробовал все ссылки, которые вы предоставили, прежде чем задавать этот вопрос. Я подозревал, что это как-то связано с тем, сколько раз я вызываю метод проверки, поэтому я пошел дальше и переписал большую часть своего кода, чтобы вызывать проверку только один раз для каждого соединения. Мой код часто вызывал проверку (раз в 30 секунд), и через некоторое время метод просто перестал что-либо возвращать.   -  person Wen W    schedule 31.12.2017
comment
метод просто перестал что-либо возвращать через некоторое время... Рад, что вы смогли это проверить. Как изначально было упираться в тупиковую ситуацию?   -  person DaniDev    schedule 02.01.2018


Ответы (1)


Я считаю, что существует ограничение на количество вызовов проверки, но я точно не знаю предела. Мой код вызывал проверку каждые 30 секунд, чтобы делать такие вещи, как получение идентификатора/электронной почты пользователя и т. д. Эта настройка перестала работать через несколько часов. Поскольку я переписал код для вызова проверки только несколько раз для каждого соединения, проверка с тех пор работает правильно.

person Wen W    schedule 31.12.2017