Получить пользователя из Usermanger после входа в систему - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь получить пользователя из usermanger после внешнего входа в систему, используя .Net-Core и IdentityServer4

public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null)
{
    if (remoteError != null)
    {
        ErrorMessage = $"Error from external provider: {remoteError}";
        return RedirectToAction(nameof(Login));
    }
    var info = await _signInManager.GetExternalLoginInfoAsync();
    if (info == null)
    {
        return RedirectToAction(nameof(Login));
    }

    // Sign in the user with this external login provider if the user already has a login.
    var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true);
    if (result.Succeeded)
    {
        var user = await _userManager.GetUserAsync(HttpContext.User);
        var serviceProvider = HttpContext.RequestServices;
        var context = serviceProvider.GetRequiredService<PublicAstootContext>();
        var coinbaseRule = new CoinbaseRule();
        await coinbaseRule.UpdateCoinbaseAccountInfo(context, user.Id, info);    
        //...
    }
}

Однако даже после успешного входа в систему, когда я пытаюсь получить пользователя изusermanger, пользователь всегда нулевой.

Как я могу получить пользователя из usermanger после моего внешнего входа?

1 Ответ

0 голосов
/ 16 декабря 2018

Вызов ExternalLoginSignInAsync не заполняется HttpContext.User - он заканчивает тем, что записывает файл cookie аутентификации, который читается в последующих запросах при попытке заполнить HttpContext.User, но не раньше.В вашем примере вызов ExternalLoginSignInAsync происходит в рамках того же запроса , что и вызов GetUserAsync, что означает, что HttpContext.User не будет представлять аутентифицированного пользователя, поэтому совпадение не будет найдено.

Вместо этого вы можете использовать UserManager.FindByLoginAsync, чтобы получить правильное значение для user:

var user = await _userManager.FindByLoginAsync(
    info.LoginProvider, info.ProviderKey);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...