在 Swagger UI 中,如何从“匿名”方法中删除挂锁图标?

g0n*_*0np 11 jwt swagger asp.net-core-webapi asp.net-core-2.1

我正在使用 .Net Core 2.1 创建 API,并使用 JSON Web Token (JWT) 进行身份验证。

我有 2 个控制器:AuthenticationControllerUserController. 我AuthenticationController[AllowAnonymous]和装饰UserController[Authorize]

Swagger 工作正常:它允许我在没有请求授权的情况下访问 AuthenticationController (SignUp/SignIn) 中的端点,并且它确实请求 JWT 在UserController.

然而,在 Swagger UI 中,每个控制器的每个端点都显示一个挂锁图标,就好像它们都需要授权一样。一切正常并按预期工作,但让我烦恼的是不需要授权的端点仍然显示挂锁图标。

有没有办法从这些端点上删除挂锁图标?

我相信可以用 做一些事情,OperationFilter但我找不到方法。

Bru*_*ins 7

当然,您需要使用 anIOperationFilter来删除匿名端点的挂锁图标。

// AuthResponsesOperationFilter.cs
public class AuthResponsesOperationFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        var authAttributes = context.MethodInfo.DeclaringType.GetCustomAttributes(true)
            .Union(context.MethodInfo.GetCustomAttributes(true))
            .OfType<AuthorizeAttribute>();

        if (authAttributes.Any())
        {
            var securityRequirement = new OpenApiSecurityRequirement()
            {
                {
                    // Put here you own security scheme, this one is an example
                    new OpenApiSecurityScheme
                    {
                        Reference = new OpenApiReference
                        {
                            Type = ReferenceType.SecurityScheme,
                            Id = "Bearer"
                        },
                        Scheme = "oauth2",
                        Name = "Bearer",
                        In = ParameterLocation.Header,
                    },
                    new List<string>()
                }
            };
            operation.Security = new List<OpenApiSecurityRequirement> { securityRequirement };
            operation.Responses.Add("401", new OpenApiResponse { Description = "Unauthorized" });
        }
    }
}

// Startup.cs
services.AddSwaggerGen(c =>
{
    ...
    c.OperationFilter<AuthResponsesOperationFilter>();
};
Run Code Online (Sandbox Code Playgroud)

不要忘记,以消除任何调用AddSecurityRequirement你的Startup.cs,否则挂锁图标仍然会被添加到所有端点。


小智 6

安装包

Swashbuckle.AspNetCore.Filters

然后当你记录你的招摇时,你需要添加以下行

  options.OperationFilter<SecurityRequirementsOperationFilter >();
Run Code Online (Sandbox Code Playgroud)

这是 .NET 6 的示例

builder.Services.AddSwaggerGen(options => {
    options.SwaggerDoc("v1", new OpenApiInfo
    {
        Title = "API",
        Version = "v1",
        Description = "API using .NET 6"
    });
    options.OperationFilter<SecurityRequirementsOperationFilter>();
});
Run Code Online (Sandbox Code Playgroud)

招摇的用户界面