在c#asp.net core web api中创建jwt令牌[重复]

Posted

技术标签:

【中文标题】在c#asp.net core web api中创建jwt令牌[重复]【英文标题】:create jwt token in c# asp.net core web api [duplicate] 【发布时间】:2019-08-03 21:35:06 【问题描述】:

我正在尝试在用户登录后创建 JWT 令牌 我正在根据以下项目执行此操作: https://github.com/CodAffection/JWT-Authentication-with-.Net-Core-Web-API-and-Angular-7/branches

我的应用程序在字符串上失败

var securityToken = tokenHandler.CreateToken(tokenDescriptor);

我收到错误

内部服务器错误 处理请求时发生未处理的异常。 ArgumentOutOfRangeException:IDX10603:解密失败。尝试过的键: '[PII 被隐藏]'

这是控制器的完整代码

   [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." );
        
    

我阅读了不同的手册,但找不到问题所在,而且我的代码与我尝试复制的项目完全相同。如果可能,请告诉我以哪种方式挖掘:)

【问题讨论】:

返回的错误是什么? 内部服务器错误 处理请求时发生未处理的异常。 ArgumentOutOfRangeException:IDX10603:解密失败。尝试的键:'[PII 已隐藏]'. 您是否正确分配了密钥? 我直接放置密钥字符串而不是 _appSettings.key 但这无济于事:( 【参考方案1】:

你的逻辑是正确的!但我认为,您的密钥没有足够的字符来创建访问令牌。只需增加密钥长度即可。

更新:对于HmacSha256Signature,秘钥长度不小于128位;换句话说,它应该至少有 16 个字符。

【讨论】:

轰隆隆!先生,非常感谢,这就是问题所在。最少需要 16 个符号,我只有 15 个 :) 一个符号,一切都开始完美运行!【参考方案2】:

这是我用来构建 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);

    

【讨论】:

以上是关于在c#asp.net core web api中创建jwt令牌[重复]的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net Core Web API 中的安全用户操作

ASP.Net Core 3.1 - Web API 中的 Post 参数始终为 NULL

如何在 Web ASP.NET (.NET Framework) 中创建启动文件?

使用 MSAL 保护 ASP.Net Core Web API 和 Angular App

ASP.NET Core 3.1 / 5 WeatherForecast 示例 Web API 项目引发错误 404

为 ASP.Net Core Web API 项目创建要在启动时转到的索引页面