3

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

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

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

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

我不需要更改源代码来进行更改吗?我错过了什么吗?

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

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

4

2 回答 2

5

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

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

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

}

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

于 2010-04-11T09:12:42.560 回答
5

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();
    }
}
于 2010-04-11T09:35:15.643 回答