【问题标题】:Winforms role based security limitationsWinforms 基于角色的安全限制
【发布时间】:2010-04-11 07:51:15
【问题描述】:

我正在使用 Microsoft 的成员资格和角色提供程序实施基于角色的安全性。

我遇到的理论问题是您在方法上实现了特定角色,例如:

[PrincipalPermissionAttribute(SecurityAction.Demand, Role="Supervisor")]
private void someMethod() {}

如果在某个时候,我不想希望 Supervisor 再访问 someMethod() 怎么办?

我是否必须更改源代码才能进行更改?我错过了什么吗?

似乎必须有某种方法来抽象主管角色和方法之间的关系,以便我可以在应用程序中创建一种方法来更改角色权限与方法的这种耦合。

任何见解或方向将不胜感激。谢谢。

【问题讨论】:

    标签: c# winforms roleprovider


    【解决方案1】:

    如果您使用声明式方法,那么可以 - 如果您突然不希望 Supervisor 的成员能够调用您的方法,则需要为此更改源代码。

    不过,您也可以在代码中以编程方式完成所有这些操作:

    private void someMethod() 
    {
        WindowsPrincipal currentUser = (Thread.CurrentPrincipal as WindowsPrincipal);
        if (currentUser != null)
        {
            if (currentUser.IsInRole("Supervisor"))
            {
                // do something here
            }
        }
    
    }
    

    您始终可以获取运行 Winforms 应用程序的当前 Windows 主体,然后您可以调用 IsInRole 方法来检查给定用户是否处于给定角色中。当然,您也可以使所有这些都可配置,例如从配置文件中读取所需的角色,如果您想允许所有人进入,您只需将角色更改为Users 或其他东西

    【讨论】:

      【解决方案2】:

      PrincipalPermissionAttribute 不倾向于在我从事的许多应用程序中使用,原因您已经提到过;该属性应用了只能通过代码更改来更改的策略。

      另一种方法是直接使用PrincipalPermission 类。所有安全属性在运行时解析为类似命名的类和方法调用。对于您的属性,将执行以下代码:

      PrincipalPermission permission = new PrincipalPermission(null, "Supervisor");
      permission.Demand(); // Throws SecurityException if user is not in the role.
      

      如果您直接使用权限类,您可以更好地控制权限的形成方式。您可以有一个数据库,您可以查询该数据库以获取角色列表并像这样执行对它们的需求:

      private void someMethod()
      {
          IEnumerable<string> roles = GetRolesForMethod("someMethod");
      
          PrincipalPermission permission = null;
      
          foreach(string role in roles)
          {
              if(permission == null)
              {
                  permission = new PrincipalPermission(null, role);
              }
              else
              {
                  permission = permission.Union(
                      new PrincipalPermission(null, role);
                      );
              }
          }
      
          if(permission != null)
          {
              permission.Demand();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-01-11
        • 1970-01-01
        • 2013-03-21
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-19
        • 2019-06-15
        相关资源
        最近更新 更多