Swagger UI-仅对某些端点进行身份验证

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

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

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

swagger swagger-ui swashbuckle jwt-auth
1个回答
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(...)的现有调用。

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