Asp.net身份验证:User.Identity.GetUserId()始终为null,而User.Identity.IsAuthenticated始终为false。

14

请看下面的代码:

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。但是我可以查看需要身份验证的 ClientDetails 视图。


你的网站是否已经设置了Windows身份验证? - Daniel Sanchez
@Daniel Sanchez 不。 <system.webServer> <modules> <remove name="FormsAuthentication" /> </modules> </system.webServer> - user2376512
请先设置cookies,然后阅读此文章:https://dev59.com/tmoy5IYBdhLWcg3wCpvQ - Nitin Chaurasia
我曾经试图做同样的事情。Nitin可能是正确的,但是这个链接https://dev59.com/vmUq5IYBdhLWcg3waP3r?rq=1更为明确地解释了它,“在调用FormsAuthentication.SetAuthCookie()后,只有下一个请求时User.Identity.IsAuthenticated才会被设置为真”。(以防其他人遇到相同的问题。) - Joel
我有同样的问题。我复制了样板代码并做了很少更改。当我运行样板Login操作时,一切都按预期工作。但是当我尝试运行我复制的操作时,我遇到了OP所遇到的问题。 - Jordan
请查看变量“scope”。我认为这是一个作用域问题。 - Sam
3个回答

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
}

13

对于问题中的“用户ID始终为空”的部分,您可以通过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,还是说那只是你的观察——但这并不会改变那一部分内容。


0
在使用 [Authorize] 属性标记方法并在授权头中发送访问令牌后,与我一起工作,似乎需要访问令牌才能识别用户。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接