我正在.NET COre API项目中使用Swagger。有没有一种方法可以仅在某些端点中在Swagger UI中应用JWT身份验证?
我仅在几个调用中放置了[Authorize]属性(也尝试将[AllowAnonymous]放置在不需要身份验证的调用中),但是当我打开Swagger UI页面时,所有端点上都有锁定符号。
您必须创建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(...)
的现有调用。