我已经使用 .NetCore 6 创建了一个 API 项目。我已经按照教程进行操作,我认为我没有错过任何内容。 我运行该程序,直到我实现只有授权用户才能访问它,它才能正常工作。
所以我实现了 JWT 身份验证。 我已在 https://jwt.io/ 中验证了令牌,并获得了已验证的签名。 但是,当我尝试通过 POSTMAN 调用具有 [Authorize] keywork 的方法时,我收到 401 Unauthorized 作为响应。 有人可以帮我解决这个问题吗? 下面是实现中的相关代码。
*********** API ENDPOINT ***********
[Authorize]
[HttpGet]
public async Task<ActionResult<IEnumerable<User>>> GetUsers()
{
if (_context.Users == null)
{
return NotFound();
}
return await _context.Users.ToListAsync();
}
*********** Program.cs ***********
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
{
options.RequireHttpsMetadata = false;
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = true,
ValidIssuer = builder.Configuration["Jwt:Issuer"],
ValidateAudience = true,
ValidAudience = builder.Configuration["Jwt:Audience"],
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(
builder.Configuration["Jwt:Key"]))
};
});
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseCors();
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
*********** GENERATES THE TOKEN ***********
private string GetToken()
{
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, _configuration["Jwt:Subject"]),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim(JwtRegisteredClaimNames.Iat, "1516239022"),
new Claim("userId" , "1"),
new Claim("name", "Jason"),
new Claim("userName", "Jason"),
new Claim("email", "[email protected]")
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("lectureTest12345"));
var singIn = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
_configuration["Jwt: Issuer"],
_configuration["Jwt:Audience"],
claims,
expires: DateTime.UtcNow.AddHours(1),
signingCredentials: singIn
);
return new JwtSecurityTokenHandler().WriteToken(token);
}
但是当我尝试通过以下方式调用具有 [Authorize] keywork 的方法时 邮递员,我收到 401 未经授权的回复。
我已经回答了你上一篇帖子的问题,看看这个答案 .