SecurityManager.IsGranted() 行为

Posted

技术标签:

【中文标题】SecurityManager.IsGranted() 行为【英文标题】:SecurityManager.IsGranted() behaviour 【发布时间】:2008-11-22 19:31:28 【问题描述】:

任何人都可以解释以下 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?

【问题讨论】:

【参考方案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】:

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

文章引用:

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

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

"权限授予确定 根据政策……”

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

【讨论】:

【参考方案3】:

我相信SecurityManager.IsGranted 主要关注代码需求(程序集等),而不是诸如主体权限之类的具体需求。

做你想做的事:

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

【讨论】:

以上是关于SecurityManager.IsGranted() 行为的主要内容,如果未能解决你的问题,请参考以下文章