Demand failed
Demand failed
在上面的代码示例中,尽管第一个 Demand 访问的是一个受限制系统目录,但它还是成功了。请记住,运行库安全系统是在基础操作系统设置上面运行的。因此,可以让运行库安全策略对某些目录授予访问权限,当托管代码试图访问这些目录时,将会引发操作系统访问冲突。直接跟在 Deny 后面的下一个 Demand 也成功了。当执行 Demand 时,没有检查请求函数的激活记录,而只检查了它的调用方。因此,尽管函数已经拒绝访问,但也不会被 Demand 检测到。对 CheckDeny 和后面的 Demand 的调用失败了。现在检查前面方法中的 Deny,因为它位于调用方的堆栈帧中。接下来我们返回到 Main 并进行一个 Assert。在这里,有一个已经断言的权限也在这个堆栈帧中被拒绝了。当我们进入 CheckDeny 时,Demand 会再次引发一个异常,这是为什么呢?从本质上讲,Deny 重写了 Assert;这是因为 Deny 权限集总是在 Assert 权限集之前接受检查。
简要的说,使托管资源可以引发托管安全堆栈审核的功能是保护资源的运行库安全系统方法。授予的权限集是程序集从每个策略级别上运行的授权计算收到的,该权限集会与资源请求的权限进行对照检查。如果后者形成了前者的一个子集,那么就可以访问受保护资源。除非已像上面描述的那样对堆栈进行了修改,否则就会对调用链中托管资源的所有调用方执行这种子集检查。因此安全堆栈审核综合了运行库安全系统的以下两个方面:1) 证据和权限之间的可配置映射;2) 通过强制所有的调用方拥有一定级别的权限来保护资源。
实际上有两种不同的方式可用于以编程的方式表达堆栈审核请求和堆栈修改操作 — 声明性安全和命令性安全。
返回页首
声明性方式和命令性方式
.NET 框架允许开发人员以两种方式表达安全约束。以声明性方式 表达安全约束意味着使用自定义属性语法。这些批注保留在类型的元数据中,在编译时会有效地溶入到程序集中。下面是声明性方式安全的一个示例:
[PrincipalPermissionAttribute(SecurityAction.Demand,
Name=@"culex\damien")]
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/