代码之家  ›  专栏  ›  技术社区  ›  johnny 5

登录后从用户管理器获取用户

  •  1
  • johnny 5  · 技术社区  · 7 年前

    我尝试在外部登录后,使用.NET核心和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);    
            //...
        }
    }
    

    但是,即使在登录成功之后,当我试图从用户管理器中获取用户时,用户始终为空。

    如何在外部登录后从用户管理器获取用户?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Kirk Larkin    7 年前

    呼唤 ExternalLoginSignInAsync 不填充 HttpContext.User -它最终会写入一个已读入的身份验证cookie 后来的 尝试填充时的请求 httpContext.用户 ,但不是以前。在您的示例中,调用 外部登录登录同步 发生在 相同要求 作为号召 GetUserAsync 也就是说 httpContext.用户 不会表示经过身份验证的用户,因此找不到匹配项。

    相反,您可以使用 UserManager.FindByLoginAsync 获取正确的值 user :

    var user = await _userManager.FindByLoginAsync(
        info.LoginProvider, info.ProviderKey);
    
    推荐文章