我有一个使用 .NET 5 的基于 ASP.NET Core 的项目。我正在使用 SwaggerUI 生成文档。我需要实现
IOperationFilter
以将所需的参数添加到任何不允许匿名访问的路由。
使用 Swagger 操作过滤器,我确实可以访问
ControllerActionDescriptor
。但是,我找不到成功的方法来检查该操作是否允许匿名访问。
这就是我所做的
public class AddTenantHeaderParameterOperationFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
var filterDescriptor = context.ApiDescription.ActionDescriptor.FilterDescriptors;
bool isAuthorized = filterDescriptor.Select(filterInfo => filterInfo.Filter).Any(filter => filter is IAsyncAuthorizationFilter);
bool allowAnonymous = filterDescriptor.Select(filterInfo => filterInfo.Filter).Any(filter => filter is IAllowAnonymousFilter);
if (!isAuthorized || allowAnonymous)
{
// we don't need to add header for anonymous allowed actions
return;
}
//.. add the headers
}
}
上面代码中的问题是,即使某些操作用
false
属性装饰,而其他操作在控制器级别装饰 isAuthorized
属性,我也会获得 allowAnonymous
和 [AllowAnonymous]
的 [Authorize]
值。
如何正确判断某个操作是否允许匿名访问或仅允许授权访问?
您需要像下面这样更改代码来判断操作或控制器是否使用
Authorize
/AllowAnonymous
属性声明:
public class AddTenantHeaderParameterOperationFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
bool isAuthorized = context.MethodInfo.DeclaringType.GetCustomAttributes(true).OfType<AuthorizeAttribute>().Any() ||
context.MethodInfo.GetCustomAttributes(true).OfType<AuthorizeAttribute>().Any();
bool allowAnonymous = context.MethodInfo.DeclaringType.GetCustomAttributes(true).OfType<AllowAnonymousAttribute>().Any() ||
context.MethodInfo.GetCustomAttributes(true).OfType<AllowAnonymousAttribute>().Any();
if (!isAuthorized || allowAnonymous)
{
// we don't need to add header for anonymous allowed actions
return;
}
//.. add the headers
}
}