我正在尝试在用户登录后创建JWT令牌 我正在根据以下项目进行此操作: https://github.com/CodAffection/JWT-Authentication-with-.Net-Core-Web-API-and-Angular-7/branches
我的应用程序对字符串失败
var securityToken = tokenHandler.CreateToken(tokenDescriptor);
我遇到错误
内部服务器错误 处理请求时发生未处理的异常。 ArgumentOutOfRangeException:IDX10603:解密失败。尝试过的按键: '[PII隐藏]&#x27
这是控制器的完整代码
[HttpPost]
[Route("Login")]
//Post: /api/ApplicationUser/Login
public async Task<IActionResult> Login(LoginModel model)
{
// var user = await _userManager.FindByEmailAsync(model.UserName);
var user = await _userManager.FindByNameAsync(model.UserName);
if (user!=null && await _userManager.CheckPasswordAsync(user, model.Password))
{
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]{
new Claim("UserID",user.Id.ToString())
}),
// Expires = DateTime.UtcNow.AddMinutes(5),
Expires = DateTime.UtcNow.AddDays(1),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_appSettings.key)), SecurityAlgorithms.HmacSha256Signature)
};
var tokenHandler = new JwtSecurityTokenHandler();
var securityToken = tokenHandler.CreateToken(tokenDescriptor);
var token = tokenHandler.WriteToken(securityToken);
return Ok(new { token });
}
else
{
return BadRequest(new { message = "username or password is incorrect." });
}
}
我已经阅读了不同的手册,但是找不到问题,而且我的代码与我要复制的项目完全相同。如果可能的话,请告诉我采用哪种挖掘方式:)
答案 0 :(得分:3)
您的逻辑是正确的!但我认为您的密钥没有足够的字符来创建访问令牌。只需增加密钥长度,就可以正常工作。
已更新:对于HmacSha256Signature,秘密密钥长度应不少于128位;不能超过128位。换句话说,它至少应包含16个字符。
答案 1 :(得分:0)
这是我用来构建jwt令牌服务器端的代码示例:
private string BuildToken(User user)
{
var userSerialise = JsonConvert.SerializeObject(user);
var claims = new[] {
new Claim(ClaimTypes.Email, user.EmailAddress),
new Claim(ClaimTypes.UserData, userSerialise)
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256Signature);
var token = new JwtSecurityToken(_config["Jwt:Issuer"],
_config["Jwt:Issuer"],
claims,
expires: DateTime.Now.AddMinutes(30),
signingCredentials: creds);
return new JwtSecurityTokenHandler().WriteToken(token);
}