在.netcore3.0以前的版本中,项目中会实现IAsyncAuthorizationFilter来拦截请求,验证是否需要权限的验证。当Action配置了AllowAnonymous特性时,就不需要权限验证。
所以代码中,会通过获取当前上下文的IFilterMetadata集合,来判断是否有AllowAnonymousFilter。
框架升级到3.0之后,不能在AuthorizationFilterContext的IFilterMetadata集合中找到AllowAnonymousFilter了。
试试 FilterDescriptors
if(!context.ActionDescriptor.FilterDescriptors.Any(item=>item.Filter is AllowAnonymousFilter))
{
}
试过不行。刚看了源码,貌似找到点了。
默认是启用了EndpointRouting
@Code_Song: 那可以这么判断
var endpoint = context.HttpContext.Features.Get<IEndpointFeature>()?.Endpoint;
if (endpoint != null && endpoint.Metadata.GetMetadata<AllowAnonymousAttribute>() != null)
{
}
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();
亲测有效 特来补充
建议提供更多代码
– dudu 5年前