JWT令牌未正确验证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JWT令牌未正确验证相关的知识,希望对你有一定的参考价值。

我有一个使用JWT进行验证的ASP.NET Core MVC应用程序

我在启动类中添加身份验证,使用我们在appsettings文件中的令牌密钥来验证令牌。

services.Configure<ApplicationSettings>(Configuration.GetSection("AppSettings"));

var key = System.Text.Encoding.UTF8
            .GetBytes(Configuration.GetSection("AppSettings:Token").Value);

services.AddAuthentication(x => {
    x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    x.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(x => {
    x.RequireHttpsMetadata = false;
    x.SaveToken = false;
    x.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(key),
        ValidateIssuer = false,
        ValidateAudience = false,
        ClockSkew =  TimeSpan.Zero
    };
});

并添加授权中间件

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        app.UseCors("MyPolicy");

        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseAuthorization();

        app.UseAuthentication();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }

现在,当用户尝试登录时,将运行以下控制器方法,并使用相同的令牌密钥生成令牌。

    [HttpPost("login")]
    public async Task<IActionResult> Login([FromBody] UserForLoginDto userForLoginDto)
    {
        var user = await _userManager.FindByNameAsync(userForLoginDto.Username);

        var result = await _signInManager
            .CheckPasswordSignInAsync(user, userForLoginDto.Password, false);



        if (result.Succeeded)
        {
            var tokenDescriptor = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(new Claim[]
                {
                    new Claim("UserID",user.Id.ToString())
                }),
                Expires = DateTime.UtcNow.AddDays(1),
                SigningCredentials = new Microsoft.IdentityModel.Tokens.SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8
                    .GetBytes(appSettings.Token)), SecurityAlgorithms.HmacSha256Signature)
            };

            var tokenHandler = new JwtSecurityTokenHandler();
            var securityToken = tokenHandler.CreateToken(tokenDescriptor);
            var token = tokenHandler.WriteToken(securityToken);

            return Ok(new { token });
        }

        return Unauthorized();
    }

因此,当用户登录时,将生成令牌并将其发送回客户端。

[我希望现在可以将[Authorize]属性添加到控制器方法,然后MVC框架将在http标头中查找有效令牌。所以我创建了一个测试控制器方法

[HttpGet]
[Authorize]
public IActionResult Get()
{
    return Ok("Test");
}

并发送一个与测试控制器方法相对应的请求,并将Authorization标头设置为Bearer <Token>,但我仍然收到未经授权的401。

谁能解释为什么会发生这种情况?请告诉我您是否需要其他信息。

答案

我认为这是使用中间件的问题:

        app.UseRouting();

        app.UseAuthorization();

        app.UseAuthentication();

可以通过以下方式尝试:


        app.UseAuthentication();
        app.UseRouting();

        app.UseAuthorization();

以上是关于JWT令牌未正确验证的主要内容,如果未能解决你的问题,请参考以下文章

JWT 令牌未经过验证,因此每次都返回 401 未授权

Asp.Net Core Identity 未正确验证令牌到期 [重复]

JWT身份验证中刷新令牌的正确实现是啥

Laravel 未检测到标头和 JWT 包中发送的身份验证令牌

Laravel Tymon\JWT Auth:在身份验证之前检查未完成的有效令牌?

在 React Redux 应用程序中使用 JWT 身份验证令牌的正确方法