Swagger 的操作过滤器无法正常工作 - 它在每个 api 端点上显示授权选项

问题描述 投票:0回答:1

我正在使用.net6.0创建一个api。我想为 api 文档添加 Swagger UI,我添加了它,并且它在大部分情况下都有效。我面临的唯一问题是 swagger UI 在存在的每个端点上显示挂锁。

下面是我的代码 - 程序.cs

    builder.Services.AddSwaggerGen(options =>
{
    options.SupportNonNullableReferenceTypes();
    options.OperationFilter<MyApi.API.Filters.SecurityRequirementsOperationFilter>();
    options.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();
    options.SwaggerDoc("v1", new OpenApiInfo() { Title = "MyAPI API", Version = "v1" });
    options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
    {
        In = ParameterLocation.Header,
        Description = "Please enter a valid token",
        Name = "Authorization",
        Type = SecuritySchemeType.Http,
        BearerFormat = "JWT",
        Scheme = "Bearer"
    });
    options.AddSecurityRequirement(new OpenApiSecurityRequirement()
    {
        {
            new OpenApiSecurityScheme()
            {
                Reference=new OpenApiReference()
                {
                    Type=ReferenceType.SecurityScheme,
                    Id="Bearer"
                }
            },
            new string[]{}
        }
    });
    options.IncludeXmlComments(xmlPath);
});

如您所见,我使用操作过滤器来标记授权选项。

SecurityRequirementsOperationFilter.cs(这是我的操作过滤器)

public class SecurityRequirementsOperationFilter : IOperationFilter
    {
        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {
            // Policy names map to scopes
            var requiredScopes = context.MethodInfo
                .GetCustomAttributes(true)
                .OfType<AuthorizeAttribute>()
                .Select(attr => attr.Policy)
                .Distinct();

            if (requiredScopes.Any())
            {

                operation.Responses.Add("401", new OpenApiResponse { Description = "Unauthorised" });
                operation.Responses.Add("403", new OpenApiResponse { Description = "Forbidden" });

                operation.Security = new List<OpenApiSecurityRequirement>();
                var secReq = new List<OpenApiSecurityRequirement>();

                operation.Security.Add(new OpenApiSecurityRequirement
                {
                    {
                        new OpenApiSecurityScheme
                        {
                            Description="Adds token to header",
                            Name="Authorization",
                            Type=SecuritySchemeType.Http,
                            In=ParameterLocation.Header,
                            Scheme = JwtBearerDefaults.AuthenticationScheme,
                            Reference = new OpenApiReference
                            {
                                Type= ReferenceType.SecurityScheme,
                                Id=JwtBearerDefaults.AuthenticationScheme
                            }
                        },new List<string>()
                    }
                });
            }
        }
    }

在这些配置之后,我在控制器中执行正常的 CRUD 操作,这些操作受到保护并需要 JWT Bearer,因此我用

[Athorize]
属性装饰了这些端点,但此外我还有两个端点 - /login 和 /register显然我想让它们公开可用,所以我用
[AllowAnonymus]
属性装饰它们。 这里的问题是生成的 swagger UI 在每个端点上显示挂锁,如下所示 -

如何摆脱公共端点上的这些挂锁?我这里缺少什么配置?

提前致谢

swagger swagger-ui .net-6.0 swashbuckle
1个回答
0
投票

希望您已经解决了这个问题,因为这已经有大约 1 年 6 分钟的历史了。无论如何,你不需要添加 选项.AddSecurityRequirement(new OpenApiSecurityRequirement()... 在您的 Program.cs 上,因为您仍在将其添加到 SecurityRequirementsOperationFilter.cs 过滤器上的授权端点上

© www.soinside.com 2019 - 2024. All rights reserved.