如何从特定的swagger文档中删除“授权”按钮?

nimxete2  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(185)

我这样配置我的昂首阔步:

services.AddSwaggerGen(
    options =>
    {
        options.SwaggerDoc(
            IntegrationApiVersion, 
            new OpenApiInfo { Title = IntegrationApiName, Version = IntegrationApiVersion });
        options.SwaggerDoc(
            ApplicationApiVersion, 
            new OpenApiInfo { Title = ApplicationApiName, Version = ApplicationApiVersion });

        options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
        {
            Description = "Bearer Token: e.g. \"Bearer <your token here>\"",
            Name = "Authorization",
            In = ParameterLocation.Header,
            Type = SecuritySchemeType.ApiKey,
            Scheme = "Bearer",
            Reference = new OpenApiReference
            {
                Id = "Bearer",
                Type = ReferenceType.SecurityScheme
            }
        });

        options.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
        options.EnableAnnotations();
        options.SchemaFilter<SmartEnumSchemaFilter>();

        options.SupportNonNullableReferenceTypes();
        options.UseAllOfToExtendReferenceSchemas();
        options.IncludeXmlComments(
            Path.Combine(AppContext.BaseDirectory, $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"),
            includeControllerXmlComments: true);

        options.OperationFilter<TestOperationFilter>();
    })
.AddFluentValidationRulesToSwagger();

但是由于只有一个文档需要验证IntegrationApiVersion,我想隐藏另一个文档的“Authorize”按钮。我发现对AddSecutityDefinition的调用是添加按钮的原因,但它不允许我定义API名称/版本,而且我不知道如何从过滤器中设置该定义
我设法显示了这些小锁,JWT auth通过添加以下过滤器可以很好地工作:

public class TestOperationFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        if (context.DocumentName == SwaggerConfiguration.IntegrationApiVersion)
        {
            operation.Security = new List<OpenApiSecurityRequirement>
            {
                new OpenApiSecurityRequirement
                {
                    {
                        new OpenApiSecurityScheme
                        {
                            Reference = new OpenApiReference
                            {
                                Type = ReferenceType.SecurityScheme,
                                Id = "Bearer"
                            },
                            Scheme = "oauth2",
                            Name = "Bearer",
                            In = ParameterLocation.Header
                        },
                        Array.Empty<string>()
                    }
                }
            }; 
        }
    }
}

但是我不知道如何为“授权”按钮本身应用同样的解决方案,这样它就出现在我的IntegrationApiVersion页面上
我能找到的最接近的东西是人们在做this,但是使用一个叫做NonBodyParameter的东西在一个过滤器里面添加一个SecurityDefinition,但是似乎这个类型对我来说已经不再可用了。有人有什么建议吗?
使用斜带扣6.3.0

dtcbnfnu

dtcbnfnu1#

安全性定义是在文档级别添加的,因此您必须修改文档。
这里我编写了一个文档过滤器,它只删除该文档的模式。

public class SwaggerDocumentFilter : IDocumentFilter
{
    public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
    {
        if(context.DocumentName == SwaggerConfiguration.ApplicationApiVersion)
        {
            swaggerDoc.Components.SecuritySchemes.Remove("Bearer");
        }
    }
}

我希望它是有帮助的

相关问题