【问题标题】:Custom Authorize Attribute MVC自定义授权属性 MVC
【发布时间】:2015-03-03 15:51:41
【问题描述】:

我正在寻找有关如何在一个操作上具有多个授权属性的建议。

例如:

[AuthorizePermission(PermissionName.SectionOne, PermissionLevel.Two)]
[AuthorizePermission(PermissionName.SectionTwo, PermissionLevel.Three)]
public ActionResult Index(int userId = 0){

}

如果用户可以访问具有所需 PermissionLevel 的 SectionOne 或 SectionTwo,那么他们应该被允许进入。

我面临的问题是如何在决定它们不允许进入之前检查这两个属性(因为它们是单独的属性)?如果第一个失败,那么它将永远不会到达第二个。

我不能将两个权限集传递给一个属性,因为它们需要配对在一起。

有人有什么建议吗?

【问题讨论】:

    标签: asp.net-mvc custom-attributes


    【解决方案1】:

    我知道的唯一方法是这样的

     public class CustomRolesAttribute : AuthorizeAttribute
      {
         public CustomRolesAttribute(params string[] roles)
         {
           Roles = String.Join(",", roles);
         }
      }
    

    用法:

    [CustomRoles("members", "admin")]
    

    【讨论】:

    • 可以使用默认授权属性[Authorize(Roles="members, admin")]
    • 当然,但可能他需要在属性中实现自己的逻辑
    【解决方案2】:

    我不能将两个权限集传递给一个属性,因为它们需要配对在一起。

    是的,你可以。

    没有理由不能在一个属性中包含所有权限。像这样的:

    [AuthorizePermission(new Permission[]{
       new Permission(PermissionName.SectionOne, PermissionLevel.Two), 
       new Permission(PermissionName.SectionTwo, PermissionLevel.Three)}]
    

    这将传递一个 Permission 对象数组,然后您可以使用 OR 逻辑在您的方法中对其进行评估。

    public class AuthorizePermissionAttribute : AuthorizeAttribute
    {
        private Permission[] _permissions = null;
        public AuthorizePermissionAttribute(Permission[] permissions)
        {
            _permissions = permissions;
        }
    }
    

    您甚至可以花哨并添加一个参数来告诉它们是 AND 还是 OR...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多