IdentityCore中ClaimsType的Null引用异常,将声明作为null

时间:2019-02-15 09:50:29

标签: asp.net asp.net-core asp.net-identity claims-based-identity asp.net-core-2.1

大家好,我正在试用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 :(得分:1)

此代码无法正常运行,因为调用_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();