我编写了以下代码来测试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)]
该计划仍未启动 . 那么所谓 declarative security 具有属性的重点是什么?
我阅读了几篇关于CAS的教程,他们使用Imperative / Declarative Security来使用CAS . 但从上面的例子来看,似乎没有必要 .
如果我在没有Imperative / Declarative Security的情况下编写代码并且没有为我的程序集提供任何证据,那么CAS是否会盲目执行任何安全策略?
或者我是否误解了如何使用CAS?
谢谢 .
1 回答
CAS许可要求导致在产生需求的方法之上验证每个调用堆栈帧 . 由于程序集不运行任何代码来调用Main方法,因此不会针对任何代码评估需求 .
通过策略拒绝执行权限会导致阻止执行程序集 . CLR本身在运行汇编代码时正在评估该权限 . 无需添加您自己的权限请求 .
稍微退一步看看CAS要求(声明性或命令性)是如何使用的,请考虑权限保护对资源的访问 . 允许访问托管代码无法访问的资源(例如:文件系统)的任何代码都应提供可用于控制对该资源的访问的许可(例如:FileIOPermission) . 允许访问资源的代码还负责在允许访问资源之前对该权限提出要求 .
编写托管代码的大多数开发人员永远不需要创建CAS权限或明确要求CAS权限,因为他们通常会访问由.NET基类库或其他Microsoft或第三方公开(并受到保护)的资源 . 党的图书馆 .