Исключение пустой ссылки для ClaimsType в IdentityCore, получение утверждений как нулевых - PullRequest
0 голосов
/ 15 февраля 2019

Привет, ребята. Я опробую Identity Core,

Мне нужно получить информацию о пользователе, который вошел в систему.

Я пытаюсь выполнить следующее:

var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true);
   if (result.Succeeded)
     {
      string userRole=_signInManager.Context.User.FindFirst(ClaimTypes.Role).Value;
    }

Я получаю исключительную ссылку Null при получении пользовательских ролей

Однако я попробовал то же самое на другом контроллере, чем на странице входа в систему Identity Core, и она работает.

Что такоеЯ делаю не так?Спасибо:)

1 Ответ

0 голосов
/ 15 февраля 2019

Этот код работает не так, как вы ожидали, потому что вызов _signInManager.PasswordSignInAsync только генерирует и устанавливает cookie аутентификации для пользователя и не регистрирует пользователя в данный момент, таким образом, в этом запросе нет зарегистрированного пользователя, и поэтому _signInManager.Context.User возвращает null.Пользователь считается авторизованным только при следующем запросе, где запрос содержит этот файл cookie аутентификации.Так что в целом код для входа выглядит так:

_signInManager.PasswordSignInAsync(...);
if (result.Succeeded)
{
    return Redirect(...);
}

Но если вы хотите получить информацию о пользователе сразу после входа в систему, вы можете сделать это следующим образом:

if (result.Succeeded)
{
    var user = await _signInManager.UserManager.FindByEmailAsync(Input.Email);
    IList<Claim> userClaims = await _signInManager.UserManager.GetClaimsAsync(user);
    string userRole = userClaims.First(c => c.Type == ClaimTypes.Role).Value;
    //...
}

Или если вы хотитеполучить только роли, которые вы можете использовать этот код

var user = await _signInManager.UserManager.FindByEmailAsync(Input.Email);
IList<string> roles = await _signInManager.UserManager.GetRolesAsync(user);
string userRole = roles.First();
...