任何人都可以解释下面的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?
答案 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);
}