首页 新闻 会员 周边 捐助

.netcore3.0 实现IAsyncAuthorizationFilter的过滤器验证时,上下文不能获取到AllowAnonymousFilter

0
悬赏园豆:10 [已解决问题] 解决于 2019-10-07 22:22

在.netcore3.0以前的版本中,项目中会实现IAsyncAuthorizationFilter来拦截请求,验证是否需要权限的验证。当Action配置了AllowAnonymous特性时,就不需要权限验证。

所以代码中,会通过获取当前上下文的IFilterMetadata集合,来判断是否有AllowAnonymousFilter。

框架升级到3.0之后,不能在AuthorizationFilterContext的IFilterMetadata集合中找到AllowAnonymousFilter了。

建议提供更多代码

dudu 5年前
< >
分享
最佳答案
0

试试 FilterDescriptors

if(!context.ActionDescriptor.FilterDescriptors.Any(item=>item.Filter is AllowAnonymousFilter))
{
}
收获园豆:10
dudu | 高人七级 |园豆:30948 | 2019-10-06 22:58

试过不行。刚看了源码,貌似找到点了。

默认是启用了EndpointRouting

Code_Song | 园豆:51 (初学一级) | 2019-10-07 12:57

@Code_Song: 那可以这么判断

var endpoint = context.HttpContext.Features.Get<IEndpointFeature>()?.Endpoint;
if (endpoint != null && endpoint.Metadata.GetMetadata<AllowAnonymousAttribute>() != null)
{            
}
dudu | 园豆:30948 (高人七级) | 2019-10-07 13:59
其他回答(2)
0

LDAR泄漏检测与修复 | 园豆:406 (菜鸟二级) | 2019-10-11 20:02
0

public void OnAuthorization(AuthorizationFilterContext context)
{
//var allowanyone = context.Filters.Any(item => item is IAllowAnonymousFilter);
var cad = (Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor)context.ActionDescriptor;

        var allowanyone = cad.ControllerTypeInfo.GetCustomAttributes(typeof(IAllowAnonymous),true).Any() 
            || cad.MethodInfo.GetCustomAttributes(typeof(IAllowAnonymous),true).Any();
码农白里黑 | 园豆:207 (菜鸟二级) | 2019-10-22 22:27

亲测有效 特来补充

支持(2) 反对(0) 码农白里黑 | 园豆:207 (菜鸟二级) | 2019-10-22 22:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册