IdentityCore 中 ClaimsType 的空引用异常,获取声明为空
Null Reference Exception for ClaimsType in IdentityCore, Getting claims as null
大家好,我正在试用 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 的登录页面尝试了相同的方法,它正在工作。
我做错了什么?
谢谢:)
此代码无法按预期运行,因为调用 _signInManager.PasswordSignInAsync
只会为用户生成和设置身份验证 cookie,并且不会立即登录用户,因此此请求中没有已登录的用户,并且这就是 _signInManager.Context.User
returns 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();
大家好,我正在试用 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 的登录页面尝试了相同的方法,它正在工作。
我做错了什么? 谢谢:)
此代码无法按预期运行,因为调用 _signInManager.PasswordSignInAsync
只会为用户生成和设置身份验证 cookie,并且不会立即登录用户,因此此请求中没有已登录的用户,并且这就是 _signInManager.Context.User
returns 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();