代码之家  ›  专栏  ›  技术社区  ›  SpruceMoose

在区域内的所有控制器上应用授权筛选器

  •  0
  • SpruceMoose  · 技术社区  · 6 年前

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

    1 回复  |  直到 6 年前
        1
  •  9
  •   SpruceMoose    5 年前

    实现这一点的一种方法是使用自定义 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"

    推荐文章