当前有一个问题,我正在尝试检索当前登录用户的名称。我的登录方法调用令牌管理器,令牌管理器构建令牌并添加适当的声明。见下文:
[HttpPost]
[Route("Login")]
public async Task<IActionResult> Login([FromBody] TokenViewModel vm)
{
try
{
if (!ModelState.IsValid)
{
return BadRequest();
}
var user = await _userManager.FindByEmailAsync(vm.Email);
var isLoginRequestValid = await _userManager.CheckPasswordAsync(user, vm.Password);
if (!isLoginRequestValid)
{
return BadRequest("Username or password is incorrect");
}
return Ok(new TokenViewModel { Token = _tokenManager.BuildJwtToken(vm.Email) });
}
catch(Exception ex)
{
return BadRequest(ex);
}
}
和令牌管理器:
public string BuildJwtToken(string email)
{
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Email, email),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(_config["Jwt:Issuer"],
_config["Jwt:Audience"],
claims,
expires: DateTime.Now.AddMinutes(double.Parse(_config["Jwt:ExpireTime"])),
signingCredentials: creds);
return new JwtSecurityTokenHandler().WriteToken(token);
}
我已经审查了许多有关此问题的帖子,但仍未找到解决方案。身份验证本身工作正常。此外,如果我检查User.Identity
并在请求时检查它的声明,那么我就能看到其中带有名称(在这种情况下为电子邮件test@test.com
)的声明。请参阅下面的屏幕快照,其中显示第一个声明是电子邮件声明,并且包含一个值test@test.com
,但是我无法直接通过Claims
来检索User.Identity
:
为什么我的User.Identity.Name
在成功添加了声明后仍在此处为空?
答案 0 :(得分:0)
好像我需要添加声明:
new Claim(ClaimTypes.Name, email)
仅使用:
new Claim(JwtRegisteredClaimNames.Email, email)
没有将身份声明与身份挂钩
此添加项是在我的BuildJwtToken(string email)
方法中。现在一切都已正确连接。希望这对以后的人有帮助