【问题标题】:Apply Authorize filter on all controllers within an area在区域内的所有控制器上应用授权过滤器
【发布时间】:2018-11-30 11:07:01
【问题描述】:

如何强制对区域内的所有控制器进行授权?具体来说,我想配置一个AuthorizeFilter 以作为Startup.ConfigureServices() 方法的一部分应用于“管理”区域。

【问题讨论】:

    标签: asp.net-core asp.net-core-mvc asp.net-core-2.1


    【解决方案1】:

    一种方法是使用自定义IControllerModelConvention

    public class AuthorizeAreaConvention : IControllerModelConvention
    {
        private readonly string _area;
        private readonly string _policy;
    
        public AuthorizeAreaConvention(string area, string policy)
        {
            _area = area;
            _policy = policy;
        }
    
        public void Apply(ControllerModel controller)
        {
            if (controller.Attributes.Any(a => 
                    a is AreaAttribute && (a as AreaAttribute).RouteValue.Equals(_area, StringComparison.OrdinalIgnoreCase))
                || controller.RouteValues.Any(r =>
                    r.Key.Equals("area", StringComparison.OrdinalIgnoreCase) && r.Value.Equals(_area, StringComparison.OrdinalIgnoreCase)))
            {
                controller.Filters.Add(new AuthorizeFilter(_policy));
            }
        }
    }
    

    然后在您的Startup.ConfigureServices() 方法中,您可以添加:

    services.AddMvc(options =>
    {
        options.Conventions.Add(
                new AuthorizeAreaConvention("Admin", Policy.AdministratorPolicy));
    });
    

    其中Policy.AdministratorPolicy 只是一个字符串常量(例如"AdministratorPolicy"),它在应用程序StartUp 中注册如下:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthorization(o =>
        {
            o.AddPolicy(Policy.AdministratorPolicy, b =>
            {
                b.RequireAuthenticatedUser();
                b.RequireClaim(ClaimTypes.Role, Roles.Admin);
            });
        });
    
        // Add framework services.
        services.AddMvc();
        // ... Omitted for brevity
    }
    

    在上面,Roles.Admin 只是一个字符串常量(例如"Admin")。

    【讨论】:

    • 您能否改进您的答案并解释您的“AdministratorPolicy”是如何注册的?
    • @user3172616 好主意。现已添加。
    猜你喜欢
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多