要解决ASP.NET Core JWT身份验证始终抛出401未经授权的问题,可以按照以下步骤进行。
首先,确保你已经正确地配置了JWT身份验证。这包括在Startup.cs文件的ConfigureServices方法中添加JWT身份验证服务,以及在Configure方法中配置身份验证中间件。例如:
public void ConfigureServices(IServiceCollection services)
{
// 添加JWT身份验证服务
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "your_issuer",
ValidAudience = "your_audience",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key"))
};
});
// 其他服务配置
// ...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// 身份验证中间件
app.UseAuthentication();
// 其他中间件配置
// ...
}
接下来,确保在生成JWT令牌时使用正确的密钥、签发者和受众。你可以使用JwtSecurityTokenHandler
类来生成JWT令牌。例如:
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.UTF8.GetBytes("your_secret_key");
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.Name, "your_username")
}),
Expires = DateTime.UtcNow.AddHours(1),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
var jwtToken = tokenHandler.WriteToken(token);
确保在生成JWT令牌时,签发者(Issuer)和受众(Audience)与身份验证服务中的配置一致。
最后,确保在需要进行身份验证的控制器或操作方法上添加[Authorize]
特性。例如:
[Authorize]
public class MyController : ControllerBase
{
// ...
}
这样,只有具有有效JWT令牌的请求才能访问被授权的控制器或操作方法。
通过遵循上述步骤,你应该能够解决ASP.NET Core JWT身份验证始终抛出401未经授权的问题。如果问题仍然存在,你可以检查JWT令牌的生成和验证过程,以确认是否有任何配置错误或逻辑错误。