Cadenas Swashbuckle Swagger UI avec OAS3 [duplicate]

Nov 25 2020

J'ai une API Web ASP.Net Core Rest documentée avec la génération Swagger de Swashbuckles (.net v5 et Swashbuckle.AspNetCore v5.6.3). Il génère une documentation Swagger et une interface utilisateur avec le support OAS3.

Mon API utilise également des jetons de support JWT. Donc, j'ai ajouté ce code à la configuration swagger:

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>()
    }
});

Et comme prévu, il a ajouté la capacité d'autorisation à l'interface utilisateur de Swagger:

Mais j'ai aussi remarqué quelques cadenas à côté de chaque requête HTTP. Ils sont déverrouillés avant autorisation:

Et après autorisation, ils se verrouillent:

Comment pourrais-je faire en sorte que ces cadenas signalent si une autorisation est requise ou non (je pense avoir vu les mêmes cadenas quelque part faire cela et il leur semble assez naturel de faire ce genre de chose aussi)?

J'ai déjà essayé quelque chose comme ça, mais cela n'a pas fonctionné (les en-têtes de requête ne contenaient plus le jeton jwt):

options.OperationFilter<SecurityRequirementsOperationFilter>();

J'ai compris que le problème est que mon Swagger utilise OAS3 et SecurityRequirementsOperationFilterdépend d'OAS2. J'ai essayé de chercher des alternatives, mais il semble qu'il n'y ait pas d'outils similaires pour OAS3.

Que devrais-je faire? Dois-je oublier cette fonctionnalité? Mais cela semble être le seul but de ces serrures. Existe-t-il des moyens d'avoir cette fonctionnalité et de rester avec OAS3 (je ne sais pas non plus si j'ai vraiment besoin du support OAS3).

Réponses

catman0745 Nov 25 2020 at 13:38

Après quelques recherches, j'ai trouvé la réponse ici: https://stackoverflow.com/a/61365691/13851956.

Le code est donc:

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>()
                }
            }
        };
    }
}

Le résultat est que les cadenas n'apparaissent qu'à côté des actions marquées avec [Authorize] et non marquées avec les attributs [AllowAnonymous]: