Asp.net身份:User.Identity.GetUserId()始终为null,User.Identity.IsAuthenticated总是为假

use*_*512 14 asp.net-mvc asp.net-mvc-5.2

请参阅下面的代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

UserId始终nullUser.Identity.IsAuthenticated永远false.但我可以查看ClientDetails需要身份验证的View .

Dew*_*wey 17

我假设您的示例是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
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这让我感到悲痛 (2认同)

Geo*_*ffM 13

对于问题的"UserId始终为空"部分,您可以通过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");
Run Code Online (Sandbox Code Playgroud)

不确定您是否希望User.Identity.IsAuthenticated为true或者是否是观察 - 这不会改变该部分.