【问题标题】:Null Reference Exception for ClaimsType in IdentityCore, Getting claims as nullIdentityCore 中 ClaimsType 的空引用异常,获取声明为空
【发布时间】:2019-07-09 10:32:03
【问题描述】:

大家好,我正在试用 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;
    }

获取用户角色时出现空引用异常

但是我在不同的控制器中尝试了相同的操作,然后是 Identity Core 的登录页面,它正在工作。

我做错了什么? 谢谢:)

【问题讨论】:

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


【解决方案1】:

此代码无法按您的预期工作,因为调用 _signInManager.PasswordSignInAsync 只会为用户生成和设置身份验证 cookie,并且现在不登录用户,因此此请求中没有登录用户,这就是为什么 @987654322 @ 返回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();

【讨论】:

  • 因此用户在登录后不会立即保存到数据库中,因此声明为空;有没有办法让我在登录后立即获取用户详细信息?我试图在登录后根据用户的角色为用户定义不同的重定向页面。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多