NET Core Web API的IAuthorizationFilter中不接受AllowAnyonmous属性

sam*_*cow 0 .net asp.net-web-api asp.net-core-webapi

我有一个用.net Core构建的新Web API,带有自定义授权过滤器。我需要绕过此过滤器进行少量操作,否则需要全局使用它。如何获取MyAuthFilter以兑现方法UserController.Post上的[Microsoft.AspNetCore.Authorization]属性?

授权过滤器:

public class MyAuthFilter : IAuthorizationFilter {
    public void OnAuthorization(AuthorizationFilterContext context) {
        //do some auth 
    }
}
Run Code Online (Sandbox Code Playgroud)

在Startup.cs中全局注册Auth过滤器:

public void ConfigureServices(IServiceCollection services) {
    services.AddMvc(options => {
        options.Filters.Add(new MyAuthFilter());
    });
}
Run Code Online (Sandbox Code Playgroud)

用户控制器上的属性修饰:

[Route("api/[controller]")]
[Authorize] //only want anonymous on single action within controller
public class UserController { 

    [HttpPost("login")]
    [AllowAnonymous] //this is not honored - MyAuthFilter.OnAuthorization is executed
        public JObject Post([FromBody] JObject userLogin) {

        }
}
Run Code Online (Sandbox Code Playgroud)

小智 6

对于任何关注 .Net (Core) 5.0 的人来说,这可以通过查看 ActionDescriptors EndpointMetaData 来完成。

if (context.ActionDescriptor.EndpointMetadata.OfType<AllowAnonymousAttribute>().Any())
            return;
Run Code Online (Sandbox Code Playgroud)


Chr*_*att 5

内置AuthorizeFilter有以下几行:

// Allow Anonymous skips all authorization
if (context.Filters.Any(item => item is IAllowAnonymousFilter))
{
    return;
}
Run Code Online (Sandbox Code Playgroud)

FWIW,当您为这些类型的事物构建自己的实现时,需要注意实现要考虑到它应有的一切。如果查看的源代码AuthorizeFilter,您会发现它确实做了很多,而您可能没有。通常,最好只是从内置实现中派生并根据需要重写,而不是尝试自己实现接口。