您必须创建一个IOperationFilter,以便仅将OpenApiSecurityScheme添加到某些端点。如何做到这一点,请参见in this blog post(针对.NET Core 3.1进行了调整,来自同一篇博客文章中的评论)。 在我的例子中,如果没有显式添加[AllowAnonymous],则所有端点默认为[Authorize](也在链接的博客文章中描述)。然后我创建了以下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[] { }
}
}
};
}
}
}
2条答案
按热度按时间zengzsys1#
您必须创建一个
IOperationFilter
,以便仅将OpenApiSecurityScheme
添加到某些端点。如何做到这一点,请参见in this blog post(针对.NET Core 3.1进行了调整,来自同一篇博客文章中的评论)。在我的例子中,如果没有显式添加
[AllowAnonymous]
,则所有端点默认为[Authorize]
(也在链接的博客文章中描述)。然后我创建了以下IOperationFilter
的实现:字符串
如果不将所有端点默认为
[Authorize]
,则必须调整if语句。最后,在调用
services.AddSwaggerGen(options => { ... }
(通常在Startup.cs
中)的地方,我有以下一行:型
请注意,上面的代码行将在同一位置替换(假定)现有的
options.AddSecurityRequirement(...)
调用。vc9ivgsu2#
下面是最好的解决方案,如果你使用
[Authorize]
属性:字符串
使用方法:
型
或
型
基于Julian的回答,我修改了
SecurityRequirementsOperationFilter
类中的if
语句,用于搜索AuthorizeAttribute
。