我编写了以下代码来测试CAS:
[SecurityPermission(SecurityAction.Demand,Flags=SecurityPermissionFlag.Execution)]
static void Main(string[] args)
{
Console.WriteLine("hello, world!");
}
在.NET 2.0配置中,我使用上面程序集的强名称来创建代码组,并为组提供 Nothing 权限集。因此装配无法按预期启动。
但是我注意到如果删除以下属性:
[SecurityPermission(SecurityAction.Demand,Flags=SecurityPermissionFlag.Execution)]
程序仍无法启动。那么具有属性的所谓声明性安全性的重点是什么?
我阅读了几篇关于CAS的教程,他们使用Imperative / Declarative Security来使用CAS。但从上面的例子来看,似乎没有必要。
如果我故意编写没有Imperative / Declarative Security的代码并且没有为我的程序集提供任何证据,那么CAS是否会盲目执行任何安全策略?
或者我是否误解了如何使用CAS?
感谢。
答案 0 :(得分:1)
CAS权限要求导致验证构成需求的方法上方的每个调用堆栈帧。由于程序集不运行任何代码来调用Main方法,因此不会针对任何代码评估需求。
通过策略拒绝执行权限会导致阻止执行程序集。 CLR本身在运行汇编代码时正在评估该权限。无需添加您自己的权限请求。
稍微退一步看看CAS要求如何使用CAS(声明性或命令性),请考虑权限保护对资源的访问。允许访问托管代码无法访问的资源(例如:文件系统)的任何代码都应提供可用于控制对该资源的访问的许可(例如:FileIOPermission)。允许访问资源的代码还负责在允许访问资源之前对该权限提出要求。
编写托管代码的大多数开发人员永远不需要创建CAS权限或明确要求CAS权限,因为他们通常会访问由.NET基类库或其他Microsoft公开(和保护)的资源。或第三方图书馆。