3

任何人都可以解释以下 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() 调用的输出都是“真”。

如果我再添加以下几行:

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

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

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

4

3 回答 3

2

在 .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

于 2013-06-13T08:11:04.447 回答
1

从此处类似问题的答案看来, IsGranted() 仅适用于 CAS 权限,而不适用于非 CAS 权限。

文章引用:

SecurityManager.IsGranted() 通过检查管理员授予的 CAS 权限来确定是否授予权限。由于 WorkingTimePermission 是非 CAS 权限,这意味着管理员设置的安全策略对该权限没有影响。换句话说,管理员无法授予或撤销 [非 CAS 权限]。因此 SecurityManager.IsGranted() 对于 [非 CAS 权限] 将始终返回 false。

我花了一段时间来习惯 CAS 与非 CAS 权限,并意识到像“安全策略”和“策略”这样的关键短语只适用于 CAS 权限。一旦我对此感到满意,破译像 SecurityManager.IsGranted 的备注部分这样看似无辜的帮助条目就变得容易多了:

“权限的授予由政策决定……”

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

于 2008-11-26T00:37:40.210 回答
0

我认为SecurityManager.IsGranted主要是查看代码需求(程序集等)-而不是特定要求,例如主要权限。

做你想做的事:

    static bool HasAccess(string role)
    {
        IPrincipal principal = System.Threading.Thread.CurrentPrincipal;
        return principal == null ? false : principal.IsInRole(role);
    }
于 2008-11-23T13:15:38.340 回答