_userManager.GetUserAsync(User) возвращает значение null

Я пытаюсь проверить статус подтверждения электронной почты пользователей после входа в систему, а затем направить их соответствующим образом.

На основе этих двух тем:

Идентификация ядра ASP.NET — получение текущего пользователя

Как получить текущего пользователя в ядре asp.net

Я пробовал это:

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 всегда равно нулю.

Как мне проверить при входе в систему, что их электронная почта подтверждена и правильно перенаправлена?


person Guerrilla    schedule 09.09.2017    source источник


Ответы (3)


В вашем подходе есть проблема, которая верна для Membership и Identity: они основаны на cookies. Файлы cookie могут быть прочитаны только в том случае, если они отправлены клиентом.

Итак, это ваш поток:

  1. Установить куки
  2. Читать куки

Это неправильно, как объяснялось выше. Ваш поток должен быть либо:

  1. Установить куки
  2. Перенаправить куда-нибудь
  3. Прочитать cookie (который теперь был отправлен клиентом)

OR

  1. Установить куки
  2. Считайте данные, где бы они ни хранились, на основе email, которые у вас уже есть.
person Camilo Terevinto    schedule 10.09.2017

У меня была электронная почта в модели, поэтому я просто посмотрел ее прямо в базе данных.

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");
    }

}
person Guerrilla    schedule 10.09.2017

Из документов :

Идентификация включается путем вызова UseAuthentication. . UseAuthentication добавляет промежуточное ПО для аутентификации. конвейер запросов.

Итак, внутри метода Configure, если вы забыли настроить

app.UseAuthentication();

вы получите тот же результат без ошибок.

person Tân    schedule 18.02.2020