Идентификатор Asp.net: User.Identity.GetUserId() всегда имеет значение null, а User.Identity.IsAuthenticated всегда false

Смотрите мой код ниже:

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 всегда null, а User.Identity.IsAuthenticated всегда false. Но я могу просмотреть View ClientDetails, для которого требуется аутентификация.

Ответ 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

Для части вопроса "UserId всегда является нулевой", вы можете искать пользователя по модели. Имя пользователя:

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

Работала со мной после пометки метода с помощью [Авторизовать] атрибута и отправки токена доступа в заголовке авторизации, кажется, что токен доступа необходим для распознавания пользователя