我有一个ASP .NET Core 2.0项目,我使用Microsoft的Identity框架进行身份验证/授权。我有以下方法验证用户对用户名和密码并返回索赔计数。我尝试登录的用户可以在数据库中找到,但它的声明在这里返回0 - 在数据库中,对用户存在声明(请参阅image)。
[HttpPost("login")]
public async Task<object> Login([FromBody] LoginDto model)
{
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, false, false);
if (result.Succeeded)
{
var appUser = _signInManager.UserManager.Users.SingleOrDefault(r => r.Email == model.Email);
var userClaims = await _signInManager.UserManager.GetClaimsAsync(appUser); // this is returning 0 claims
return Ok(HttpContext.User.Claims.Count());
}
throw new ApplicationException("INVALID_LOGIN_ATTEMPT");
}
关于可能的重复问题的答案并没有解决我的问题。
对于UserManager.GetClaimsAsync
,它将查询来自AspNetUserClaims
而不是AspNetUserRoles
的索赔。你可以通过GetClaimsAsync查看这个
return await UserClaims.Where(uc => uc.UserId.Equals(user.Id)).Select(c => c.ToClaim()).ToListAsync(cancellationToken);
通常,我们可以尝试使用HttpContext.User.Claims
来检索用户的声明,但它可以用于子请求而不是当前的登录请求。如果你将这个HttpContext.User.Claims
移动到Home
Index
动作,它将返回预期的结果。
为了获得Login
的索赔,我建议你试试
var claimsPrincipal = await _signInManager.CreateUserPrincipalAsync(appUser);
var claims = claimsPrincipal.Claims.ToList();