我正在使用Microsoft的成员资格和角色提供程序实现基于角色的安全性。
我遇到的理论问题是您在以下方法上实现特定角色:
[PrincipalPermissionAttribute(SecurityAction.Demand, Role="Supervisor")]
private void someMethod() {}
如果在某个时候,我不希望主管再次访问someMethod(),该怎么办?
我不是必须更改源代码才能进行更改吗?我错过了什么吗?
似乎必须有一些方法来抽象主管角色和方法之间的关系,这样我就可以在应用程序中创建一种方法来改变角色权限与方法的这种耦合。
任何见解或指示都将受到赞赏。谢谢。
答案 0 :(得分: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
或其他
答案 1 :(得分: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();
}
}