Я перенес проект из do tnet core 2.1 в 3.1. Все выглядит хорошо, за исключением того, что заголовок авторизации не отправляется при использовании Swagger UI. Я нашел несколько SO, которые пытались решить эту проблему, и это является ее результатом.
headers
Startup.cs
services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.RequireHttpsMetadata = (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development") ? false : true;
options.ClaimsIssuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)];
options.TokenValidationParameters = tokenValidationParameters;
});
services.AddSwaggerGen(c =>
{
...
c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Name = "Authorization",
Type = SecuritySchemeType.ApiKey,
Scheme = "Bearer",
BearerFormat = "JWT",
In = ParameterLocation.Header,
Description = "JWT Authorization header using the Bearer scheme."
});
c.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "Bearer"
}
},
new string[] {}
}
});
c.EnableAnnotations();
//
c.OperationFilter<HeaderParametersFilter>();
...
}
В предыдущей версии Swashbuckle это было обработано с использованием реализации IOperationFilter
, и я оставил это на месте, чтобы токен мог быть введен в пользовательском интерфейсе. Наиболее многообещающим ответом SO был следующий: Миграция в Swashbuckle.AspNetCore версии 5 , где было найдено решение, но у меня не сработали те же конфигурации.
HeaderParametersFilter: IOperationFilter
...
if (isAuthorized && !allowAnonymous) {
AddHeader(operation, "Authorization", "access token", "string", true, "Bearer {access token}");
}
...
private static void AddHeader(OpenApiOperation operation, string name, string description, string type, bool isRequired, string defaultValue)
{
operation.Parameters.Add(new OpenApiParameter
{
Name = name,
In = ParameterLocation.Header,
Description = description,
Required = isRequired,
Schema = new OpenApiSchema
{
Type = type,
Default = new OpenApiString(defaultValue)
}
});
}