Override global authorize filter in ASP.NET Core 1.0 MVC

前端 未结 2 855
死守一世寂寞
死守一世寂寞 2020-12-02 23:20

I am trying to set up authorization in ASP.NET Core 1.0 (MVC 6) web app.

More restrictive approach - by default I want to restrict all controllers and action metho

2条回答
  •  天命终不由人
    2020-12-02 23:45

    Using @Daniel's solution I ran into the same issue mentioned by @TarkaDaal in the comment (there's 2 AuthorizeFilter in the context for each call...not quite sure where they are coming from).

    So my way to solve it is as follow:

    public class IsAdminOrAuthorizeFilter : AuthorizeFilter
    {
        public IsAdminOrAuthorizeFilter(AuthorizationPolicy policy): base(policy)
        {
        }
    
        public override Task OnAuthorizationAsync(Microsoft.AspNet.Mvc.Filters.AuthorizationContext context)
        {
            if (context.Filters.Any(f =>
            {
                var filter = f as AuthorizeFilter;
                //There's 2 default Authorize filter in the context for some reason...so we need to filter out the empty ones
                return filter?.AuthorizeData != null && filter.AuthorizeData.Any() && f != this;
            }))
            {
                return Task.FromResult(0);
            }
    
            //Otherwise apply this policy
            return base.OnAuthorizationAsync(context);
        }        
    }
    
    services.AddMvc(opts => 
    {
        opts.Filters.Add(new IsAdminOrAuthorizeFilter(new AuthorizationPolicyBuilder().RequireRole("admin").Build()));
    });
    

    This is ugly but it works in this case because if you're only using the Authorize attribute with no arguments you're going to be handled by the new AuthorizationPolicyBuilder().RequireRole("admin").Build() filter anyway.

提交回复
热议问题