SecurityManager.IsGranted()行为

时间:2008-11-22 19:31:29

标签: c# cas securitymanager principalpermission

任何人都可以解释下面的c#行为吗?我写了一个小的控制台应用程序只是为了了解CAS,但我似乎无法理解为什么以下代码行像他们一样工作:

string[] myRoles = new string[] { "role1", "role2", "role3" };
GenericIdentity myIdentity = new GenericIdentity("myUsername", "customAuthType");
GenericPrincipal myPrincipal = new GenericPrincipal(myIdentity, myRoles);

System.Threading.Thread.CurrentPrincipal = myPrincipal;

Console.WriteLine(SecurityManager.IsGranted(new PrincipalPermission(null, "role1")));
Console.WriteLine(SecurityManager.IsGranted(new PrincipalPermission(null, "roleX")));

对于SecurityManager.IsGranted()调用,输出为“true”。

如果我然后添加以下行:

 new PrincipalPermission(null, "role1").Demand();
 new PrincipalPermission(null, "roleX").Demand();

第一个请求调用通过,但第二个请求调用(如预期的那样)会导致SecurityException。

为什么SecurityManager.IsGranted() - 调用对于“roleX”权限不返回false?

3 个答案:

答案 0 :(得分:1)

从类似问题here的答案中可以看出,IsGranted()仅适用于CAS权限,而不适用于非CAS权限。

文章引言:

  

SecurityManager.IsGranted()确定   是否授予权限   检查CAS权限   已被授予   管理员。以来   WorkingTimePermission是非CAS   许可,这意味着安全   管理员设置的策略   对该许可没有影响。   换句话说,没有办法   管理员授予或撤销   [非CAS许可]。因此   SecurityManager.IsGranted()会   总是返回false   [非CAS许可]。

  

我花了一段时间才习惯CAS   与非CAS权限,以及   意识到关键短语就像   仅“安全政策”和“政策”   适用于CAS权限。一旦我得到了   对此感到满意,破译   显然是无辜的帮助条目   SecurityManager.IsGranted的备注   部分变得更容易:

     

“确定授予权限   政策......“

     

这意味着 - 但没有明确说明   state - 该方法仅适用   具有CAS权限,因为它是   检查当前的安全策略。   需要一些时间来适应。

答案 1 :(得分:1)

在.NET 4.0中,SecurityManager.IsGranted已经过时。

这就是它,如果你在.NET 4.0兼容性中进行编译,它会抱怨。

bool isGranted = SecurityManager.IsGranted(new SecurityPermission(SecurityPermissionFlag.Infrastructure))

修复它:

var permissionSet = new PermissionSet(PermissionState.None);
permissionSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.UnmanagedCode));
bool isGranted = permissionSet.IsSubsetOf(AppDomain.CurrentDomain.PermissionSet);

参考:
http://www.stringbuilder.net/post/2009/07/31/In-NET-40-SecurityManagerIsGranted-is-obsolete.aspx

答案 2 :(得分:0)

我相信SecurityManager.IsGranted主要关注代码需求(程序集等) - 而不是主要权限等特定需求。

做你想做的事:

    static bool HasAccess(string role)
    {
        IPrincipal principal = System.Threading.Thread.CurrentPrincipal;
        return principal == null ? false : principal.IsInRole(role);
    }