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

我有2个 Controller :AuthenticationControllerUserController
我用AuthenticationController装饰了[AllowAnonymous],并用UserController装饰了[Authorize]

Swagger运行正常:它允许我在不请求授权的情况下访问AuthenticationController(SignUp/SignIn)中的端点,并且确实请求JWT在UserController中命中端点。

但是,在Swagger UI中,每个 Controller 的每个端点都显示一个挂锁图标,好像它们都需要授权一样。一切正常且按预期工作,但令我困扰的是不需要授权的端点仍显示该挂锁图标。

是否可以从这些端点中删除挂锁图标?

我相信OperationFilter可以完成某些工作,但我找不到办法。

最佳答案

绝对地,您需要使用IOperationFilter删除匿名端点的挂锁图标。

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

不要忘记删除AddSecurityRequirement中对Startup.cs的任何调用,否则挂锁图标仍将添加到所有端点。

08-05 02:23