Swashbuckle Swagger UI Vorhängeschlösser mit OAS3 [Duplikat]
Ich habe eine ASP.Net Core Rest-Web-API, die mit der Swagger-Generation von Swashbuckles (.net v5 und Swashbuckle.AspNetCore v5.6.3) dokumentiert ist. Es generiert Swagger-Dokumentation und Benutzeroberfläche mit OAS3-Unterstützung.
Auch meine API verwendet JWT-Inhaber-Token. Also habe ich diesen Code zur Swagger-Konfiguration hinzugefügt:
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
{
In = ParameterLocation.Header,
Name = "Authorization",
Type = SecuritySchemeType.ApiKey,
Description = "Put `bearer` keyword in front of token"
});
options.AddSecurityRequirement(new OpenApiSecurityRequirement()
{
{
new OpenApiSecurityScheme()
{
Reference = new OpenApiReference()
{
Id = "Bearer",
Type = ReferenceType.SecurityScheme
}
},
Array.Empty<string>()
}
});
Und wie erwartet wurde der Swagger-Benutzeroberfläche die Autorisierungsfunktion hinzugefügt:

Aber ich habe auch ein paar Vorhängeschlösser neben jeder HTTP-Anfrage bemerkt. Sie werden vor der Autorisierung entsperrt:

Und nach der Autorisierung sperren sie:

Wie könnte ich diese Vorhängeschlösser dazu bringen, zu signalisieren, ob eine Autorisierung erforderlich ist oder nicht (ich glaube, ich habe irgendwo die gleichen Vorhängeschlösser gesehen, und es erscheint ihnen ziemlich natürlich, auch so etwas zu tun)?
Ich habe so etwas bereits versucht, aber es hat nicht funktioniert (Anforderungsheader enthielten nicht mehr das JWT-Token):
options.OperationFilter<SecurityRequirementsOperationFilter>();
Ich habe herausgefunden, dass das Problem darin besteht, dass mein Swagger OAS3 verwendet und SecurityRequirementsOperationFilter
von OAS2 abhängt. Ich habe versucht, nach Alternativen zu suchen, aber es sieht so aus, als gäbe es keine ähnlichen Tools für OAS3.
Was soll ich machen? Sollte ich diese Funktion vergessen? Aber das scheint der einzige Zweck dieser Schlösser zu sein. Gibt es Möglichkeiten, diese Funktion zu nutzen und bei OAS3 zu bleiben (auch ich bin mir nicht sicher, ob ich wirklich so viel OAS3-Unterstützung benötige).
Antworten
Nach einigen Recherchen fand ich hier die Antwort: https://stackoverflow.com/a/61365691/13851956.
Der Code lautet also:
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
{
Description = "No need to put the `bearer` keyword in front of token",
Type = SecuritySchemeType.Http,
Scheme = "bearer",
BearerFormat = "JWT"
});
options.OperationFilter<AuthorizationOperationFilter>();
public class AuthorizationOperationFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
var actionMetadata = context.ApiDescription.ActionDescriptor.EndpointMetadata;
var isAuthorized = actionMetadata.Any(metadataItem => metadataItem is AuthorizeAttribute);
var allowAnonymous = actionMetadata.Any(metadataItem => metadataItem is AllowAnonymousAttribute);
if (!isAuthorized || allowAnonymous)
{
return;
}
operation.Parameters ??= new List<OpenApiParameter>();
operation.Security = new List<OpenApiSecurityRequirement>
{
new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Id = "Bearer",
Type = ReferenceType.SecurityScheme
}
},
Array.Empty<string>()
}
}
};
}
}
Das Ergebnis ist, dass Vorhängeschlösser nur neben Aktionen angezeigt werden, die mit [Autorisieren] und nicht mit [AllowAnonymous] -Attributen markiert sind:
