Swagger UI-仅针对某些端点的身份验证

时间:2019-12-03 13:35:31

标签: swagger swagger-ui swashbuckle jwt-auth

我在.NET COre API项目中使用Swagger。 有没有一种方法可以仅在某些端点上在Swagger UI中应用JWT身份验证?

我仅在少数几个调用中放置了[Authorize]属性(也尝试将[AllowAnonymous]放置在不需要身份验证的调用中),但是当我打开Swagger UI页面时,所有端点上都有锁定符号

1 个答案:

答案 0 :(得分:0)

您必须创建一个IOperationFilter才能仅将OpenApiSecurityScheme添加到某些端点。 in this blog post(根据同一博客文章中的评论针对.NET Core 3.1进行了调整)进行了描述。

就我而言,如果未显式添加[Authorize],则所有端点默认为[AllowAnonymous](也在链接的博客文章中进行了描述)。然后,我创建IOperationFilter的以下实现:

public class SecurityRequirementsOperationFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        if (!context.MethodInfo.GetCustomAttributes(true).Any(x => x is AllowAnonymousAttribute) &&
            !(context.MethodInfo.DeclaringType?.GetCustomAttributes(true).Any(x => x is AllowAnonymousAttribute) ?? false))
        {
            operation.Security = new List<OpenApiSecurityRequirement>
            {
                new OpenApiSecurityRequirement
                {
                    {
                        new OpenApiSecurityScheme {
                            Reference = new OpenApiReference {
                                Type = ReferenceType.SecurityScheme,
                                Id = "bearer"
                            }
                        }, new string[] { }
                    }
                }
            };
        }
    }
}

如果您未将所有端点默认都设为[Authorize],则必须调整if语句。

最后,我在呼叫services.AddSwaggerGen(options => { ... }的地方(通常在Startup.cs中)有以下一行:

options.OperationFilter<SecurityRequirementsOperationFilter>();

请注意,以上行将替换(大概)在同一位置对options.AddSecurityRequirement(...)的现有调用。