【问题标题】:Asp.net Identity : User.Identity.GetUserId() is always null and User.Identity.IsAuthenticated is alway falseAsp.net Identity : User.Identity.GetUserId() 始终为 null 并且 User.Identity.IsAuthenticated 始终为 false
【发布时间】:2017-08-16 02:43:50
【问题描述】:

请参阅下面的代码:

var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
    case SignInStatus.Success:
        string UserId = User.Identity.GetUserId(); 
        return RedirectToAction("ClientDetails","Home");
    case SignInStatus.LockedOut:
        return View("Lockout");
    case SignInStatus.RequiresVerification:
        return RedirectToAction("SendCode", "Account", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
    case SignInStatus.Failure:
    default:
        ModelState.AddModelError("", "Invalid login attempt.");
        return View(model);
}

UserId 始终是 nullUser.Identity.IsAuthenticated 始终是 false。但是我可以查看需要认证的View ClientDetails

【问题讨论】:

  • 您的站点设置是否适用于 Windows 身份验证?
  • @Daniel Sanchez No.
  • 阅读本文stackoverflow.com/questions/8810496/…请先设置cookies
  • 我试图做同样的事情。 Nitin 可能是正确的,但是这个链接stackoverflow.com/questions/14508495/… 更清楚地说明了“在调用 FormsAuthentication.SetAuthCookie() 之后的下一个请求之前,User.Identity.IsAuthenticated 不会设置为 true”(以防其他人出现有同样的问题。)
  • 我也有同样的问题。我复制了样板代码并且几乎没有改变。当我运行样板登录操作时,一切都按预期工作。当我尝试复制的操作时,我知道 OP 会发生什么。

标签: asp.net-mvc asp.net-mvc-5.2


【解决方案1】:

我假设您的示例是来自 AccountController.Login() 方法的代码。我和你有同样的问题,但发现直到下一个请求才会填充 User 对象。试试这个方法:

case SignInStatus.Success:
    return RedirectToAction("DoWork", "Account");


public async Task<ActionResult> DoWork()
{
    //this works
    string UserId = User.Identity.GetUserId();
    //return to View or Redirect again
}

【讨论】:

    【解决方案2】:

    对于问题的“The UserId is always null”部分,可以通过model.UserName查找用户:

    var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false);
    switch (result)
    {
        case SignInStatus.Success:
            ApplicationUser user = UserManager.FindByName(model.UserName);
            string UserId = user.Id;
            // UserId is now populated
            return RedirectToAction("ClientDetails","Home");
    

    等等。不确定您是否想要 User.Identity.IsAuthenticated true 或者这是否是一个观察结果 - 这不会改变那部分。

    【讨论】:

      【解决方案3】:

      在使用 [Authorize] 标记方法后与我合作 属性并在授权头中发送访问令牌,似乎需要访问令牌来识别用户

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-09
        • 2016-04-19
        • 2020-06-27
        • 2021-09-03
        • 2016-11-20
        • 2012-03-29
        • 2015-03-08
        相关资源
        最近更新 更多