Привет. Я использую jwt авторизацию со swagger-ом.
Сначала я авторизируюcь с помощью метода Login который возвращает мне jwt токен.
Вот как я генерирую этот токен:
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
new Claim(ClaimTypes.Email, user.Email),
};
var token = new JwtSecurityToken(
issuer: _configuration["User:Jwt:Issuer"],
audience: _configuration["User:Jwt:Audience"],
claims: claims,
expires: DateTime.UtcNow.AddDays(Convert.ToDouble(_configuration["User:Jwt:ExpireDays"])),
signingCredentials: new SigningCredentials(
new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["User:Jwt:SecretKey"])),
SecurityAlgorithms.HmacSha256Signature
)
);
return new JwtSecurityTokenHandler().WriteToken(token);
потом я передаю этот токен для swagger авторизации, вот как она реализована:
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Description = "JWT Authorization header using the Bearer scheme. Example: \"Bearer {token}\"",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey,
Scheme = "Bearer",
BearerFormat = "JWT"
});
c.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "Bearer"
}
},
new string[] {}
}
});
});
Дальше я пытаюсь сделать запрос к действию на которое я навешал атрибут [Authorize]. Swagger в заголовок передает следующее: Authorization: Bearer {token}. Но мне возвращается код 404 и самое интересное, что если я уберу атрибут авторизации, то действие будет найдено.
Вот параметры валидации токена:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
//options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = false,
ValidateIssuerSigningKey = true,
ValidIssuer = configuration["User:Jwt:Issuer"],
ValidAudience = configuration["User:Jwt:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["User:Jwt:SecretKey"]))
};
});
А вот как выглядит токен (секретная фраза - 1234567890qazwsxe):
eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IjMiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9lbWFpbGFkZHJlc3MiOiJ1c2VyQGV4YW1wbGUuY29tIiwiZXhwIjoxNjgxMTEzODM2LCJpc3MiOiJhdXRoU2VydmljZSIsImF1ZCI6InJlc291cnNlU2VydmVyIn0.hIsj1b0pGCqk6iBW2GYZ1aO7x7QokUcq8CT4D0TPItg
И еще вот мой pipeline:
var app = builder.Build();
app.UseCustomExceptionHandler();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
//app.UseHttpsRedirection();
app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
Если есть что-то еще, то с радостью предоставлю больше информации.
Спасибо за любую помощь!