Поскольку Microsoft перешла к внесению некоторых серьезных изменений в .net 10 с помощью openapi/swagger, у меня возникли некоторые проблемы с использованием Swagger UI для скрытия значка блокировки на конечной точке [AllowAnonymous], в то время как он был на [Authorize], совместимом с ApiVersioning
Поскольку весь мой поиск в Интернете давал мне решения, которые были для предыдущей версии или не работали должным образом, я придумал это.
Я потратил на это время?
Есть ли лучший способ?
private static void AddOpenApiVersion(OpenApiOptions options)
{
options.AddDocumentTransformer((document, context, cancellationToken) =>
{
document.Components ??= new OpenApiComponents();
document.Components.SecuritySchemes ??= new Dictionary();
var paths = context.DescriptionGroups.First(x => x.GroupName == context.DocumentName)
.Items;
foreach(var path in paths)
{
var hasAllowAnonymous = path.ActionDescriptor
.EndpointMetadata
.OfType()
.Any();
if(hasAllowAnonymous)
{
continue;
}
var documentPath = document.Paths.First(x => x.Key[1..] == path.RelativePath).Value;
var documentOperation = documentPath.Operations?.First(x => x.Key.Method == path.HttpMethod).Value;
if(documentOperation != null)
{
documentOperation.Security = [new OpenApiSecurityRequirement
{
{new OpenApiSecuritySchemeReference("bearer"), []}
}];
}
}
document.Components.SecuritySchemes.Add("bearer", new OpenApiSecurityScheme
{
Type = SecuritySchemeType.Http,
Scheme = "bearer"
});
document.SetReferenceHostDocument();
return Task.CompletedTask;
});
}