_userManager.GetUserAsync(User)返回null

时间:2017-09-09 23:37:13

标签: c# asp.net-core asp.net-core-mvc asp.net-core-2.0

我正在尝试在登录后检查用户的电子邮件确认状态,然后直接指示他们。

基于这两个主题:

ASP.NET Core Identity - get current user

How get current user in asp.net core

我试过了:

var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
    ClaimsPrincipal currentUser = this.User;
    var thisUser = await _userManager.GetUserAsync(currentUser);
    if(thisUser.EmailConfirmed)
    {
        return View("~/Views/Task/Index.cshtml");
    }
    else
    {
        return View("ConfirmEmail");
    }
}

还有这个:

var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{   
    var thisUser = await _userManager.GetUserAsync(HttpContext.User);
    if(thisUser.EmailConfirmed)
    {
        return View("~/Views/Task/Index.cshtml");
    }
    else
    {
        return View("ConfirmEmail");
    }
}

从控制器内部开始,thisUser始终为空。

如何登录确认其电子邮件已确认并正确重定向?

3 个答案:

答案 0 :(得分:2)

您的方法存在问题,MembershipIdentity也是如此:它们基于cookies。 Cookie只有在客户发送时才能读取。

所以,这是你的流程:

  1. 设置Cookie
  2. 阅读Cookie
  3. 如上所述,这是错误的。你的流程应该是:

    1. 设置Cookie
    2. 重定向某处
    3. 读取cookie(现在由客户发送)
    4. OR

      1. 设置Cookie
      2. 根据您已经拥有的email
      3. 从任何位置读取数据

答案 1 :(得分:0)

我在模型中收到了电子邮件,所以我只是直接在数据库中查找。

var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
    _logger.LogInformation("User logged in.");

    var user = _context.Users.Single(x => x.Email == model.Email);

    if(user.EmailConfirmed)
    {
        return View("~/Views/Task/Index.cshtml");
    }
    else
    {
        return View("ConfirmEmail");
    }

}

答案 2 :(得分:0)

来自docs

通过调用UseAuthentication启用身份。使用验证 向请求管道添加身份验证middleware

因此,在Configure方法中,如果您忘记设置

app.UseAuthentication();

您将获得相同的结果,而不会出现任何错误。