Swashbuckle Swagger UI 자물쇠 (OAS3 포함) [중복]

Nov 25 2020

Swashbuckles의 Swagger 세대 (.net v5 및 Swashbuckle.AspNetCore v5.6.3)로 문서화 된 ASP.Net Core Rest Web API가 있습니다 . OAS3 지원으로 Swagger 문서 및 UI를 생성합니다.

또한 내 API는 JWT 전달자 토큰을 사용합니다. 그래서이 코드를 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>()
    }
});

예상대로 Swagger UI에 권한 부여 기능을 추가했습니다.

그러나 모든 HTTP 요청 옆에 몇 개의 자물쇠가 있음을 발견했습니다. 승인 전에 잠금 해제됩니다.

그리고 승인 후 잠금 :

승인이 필요한지 여부를 알려주는이 자물쇠를 어떻게 얻을 수 있습니까 (어딘가에서이 작업을 수행하는 동일한 자물쇠를 본 것 같은데 이런 종류의 작업도 수행하는 것이 매우 자연스러운 것 같습니다)?

이미 그런 것을 시도했지만 작동하지 않았습니다 (요청 헤더에 더 이상 jwt 토큰이 포함되지 않음).

options.OperationFilter<SecurityRequirementsOperationFilter>();

문제는 내 Swagger가 OAS3를 사용하고 OAS2에 SecurityRequirementsOperationFilter의존한다는 것입니다. 대안을 찾아 보았지만 OAS3에 대한 유사한 도구가없는 것 같습니다.

어떻게해야합니까? 이 기능을 잊어야합니까? 그러나 이것이이 자물쇠의 유일한 목적인 것 같습니다. 이 기능을 사용하고 OAS3을 유지하는 방법이 있습니까? (또한 OAS3 지원이 그렇게 많이 필요한지 확실하지 않습니다).

답변

catman0745 Nov 25 2020 at 13:38

몇 가지 조사 후 여기에서 답을 찾았습니다. https://stackoverflow.com/a/61365691/13851956.

따라서 코드는 다음과 같습니다.

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

결과적으로 자물쇠는 [Authorize]로 표시되고 [AllowAnonymous] 속성으로 표시되지 않은 작업 옆에만 나타납니다.