在c#asp.net核心网络api中创建jwt令牌

时间:2019-03-13 09:07:27

标签: c# asp.net-core jwt token

我正在尝试在用户登录后创建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." });
        }
    }

我已经阅读了不同的手册,但是找不到问题,而且我的代码与我要复制的项目完全相同。如果可能的话,请告诉我采用哪种挖掘方式:)

2 个答案:

答案 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);

    }
相关问题