asp.net-core - 如何检查操作是否允许匿名访问或仅授权?
问题描述
我有一个基于 ASP.NET 5 的项目。我正在使用 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
}
}
推荐阅读
- c++ - 如何使这个 UDPSocket 对象成为全局对象,以便在其他功能中使用它?
- macos - 如何在 Mac OS 9 上设置 wxWidgets?
- c++ - 每次我尝试创建稀疏矩阵时的不同行为
- c# - 有没有办法在编辑器窗口中更快地绘制游戏对象?
- python - 为 plotly 指定数据单元中的标记大小
- python - 如何计算二维数组(Python)中一维数组的数量?
- r - ggplot 默认颜色的十六进制表示法
- java - Selenium 电网连接拒绝
- mysql - mysql 正确从多个表中拉取数据,没有重复和不正确的数据
- javascript - 根据另一个数组中的值获取键数组