【问题标题】:Assign custom class permissions check for controller actions in ASP.NET MVC4为 ASP.NET MVC4 中的控制器操作分配自定义类权限检查
【发布时间】:2012-10-09 23:46:27
【问题描述】:

我有一个带有自定义用户/角色提供程序的 ASP.NET MVC4 站点。实体框架与底层的用户和角色实体一起工作。现在我介绍RolePermissions 的概念。每个角色都有一个关联的权限列表,允许该角色中的用户在系统中执行某些操作,例如删除 cmets。

在我的自定义构建管理面板中,我想列出控制器的所有操作,并且能够根据当前用户角色中权限的存在来允许或禁止对某些操作的调用。

问题是:

  1. 有可能吗?
  2. 如何在控制器中列出一组操作。
  3. 如何分配或取消操作与角色权限之间的关联。

可能的策略:

我引入了一个应用于所有控制器和操作的全局自定义过滤器,它检查我的数据库以查看我是否具有逻辑关联。这样,每次用户调用某个操作时都会运行一个检查代码。我仍然如何列出控制器和操作(也许通过反射?)

【问题讨论】:

    标签: asp.net asp.net-mvc security reflection permissions


    【解决方案1】:

    我仍然如何列出控制器和操作(也许通过反射?)

    是的,反思是一种方法。下面是一个如何获取所有控制器类型列表的示例:

    public IEnumerable<Type> GetControllers()
    {
        IEnumerable<Type> typesSoFar = Type.EmptyTypes;
        var assemblies = BuildManager.GetReferencedAssemblies();
        foreach (Assembly assembly in assemblies)
        {
            Type[] typesInAsm;
            try
            {
                typesInAsm = assembly.GetTypes();
            }
            catch (ReflectionTypeLoadException ex)
            {
                typesInAsm = ex.Types;
            }
            typesSoFar = typesSoFar.Concat(typesInAsm);
        }
        return typesSoFar.Where(type => 
            type != null && 
            type.IsPublic && 
            type.IsClass && 
            !type.IsAbstract && 
            typeof(IController).IsAssignableFrom(type)
        );
    }
    

    然后您可以获得每个控制器类型的ActionDescriptor 列表:

    foreach (var controller in GetControllers())
    {
        ActionDescriptor[] actions = new ReflectedControllerDescriptor(controller).GetCanonicalActions();
        foreach (var action in actions)
        {
            // here you know everything about the action
        }
    }
    

    【讨论】:

    • 由于某种原因,操作列表始终为空,因为 `controller.GetType() 返回一个 RuntimeType,当反映为 ControllerDescriptor 时没有任何操作。但是 controller.Name 是我的网站控制器的正确名称。
    • 好的,发现一个问题 - ReflectedControllerDescriptor(controller).GetCanonicalActions(); 没有必要调用controller.GetType(),因为控制器变量已经拥有一个类型对象。
    猜你喜欢
    • 2013-05-18
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多