Winforms基于角色的安全限制

muh*_*han 3 c# roleprovider winforms

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

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

[PrincipalPermissionAttribute(SecurityAction.Demand, Role="Supervisor")]
private void someMethod() {}
Run Code Online (Sandbox Code Playgroud)

如果在某些时候,我希望主管再访问someMethod()?

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

似乎必须有一些方法来抽象监督者角色和方法之间的关系,这样我就可以在应用程序中创建一种方法来改变角色权限与方法的这种耦合.

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

mar*_*c_s 5

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

您始终可以获取运行Winforms应用程序的当前Windows主体,然后可以调用该IsInRole方法来检查给定用户是否处于给定角色.当然,你也可以做这一切的配置,例如读取配置文件所需的角色,如果你希望让大家在,你只是简单地改变角色是Users什么


Pau*_*ner 5

PrincipalPermissionAttribute因为你所触及的原因,我不习惯在许多应用程序中使用它; 该属性应用的策略只能通过代码更改来更改.

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

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

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)