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