关于代码访问安全(CAS)工作范例的问题

时间:2010-10-04 09:02:15

标签: .net security clr code-access-security

我编写了以下代码来测试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?

感谢。

1 个答案:

答案 0 :(得分:1)

CAS权限要求导致验证构成需求的方法上方的每个调用堆栈帧。由于程序集不运行任何代码来调用Main方法,因此不会针对任何代码评估需求。

通过策略拒绝执行权限会导致阻止执行程序集。 CLR本身在运行汇编代码时正在评估该权限。无需添加您自己的权限请求。

稍微退一步看看CAS要求如何使用CAS(声明性或命令性),请考虑权限保护对资源的访问。允许访问托管代码无法访问的资源(例如:文件系统)的任何代码都应提供可用于控制对该资源的访问的许可(例如:FileIOPermission)。允许访问资源的代码还负责在允许访问资源之前对该权限提出要求。

编写托管代码的大多数开发人员永远不需要创建CAS权限或明确要求CAS权限,因为他们通常会访问由.NET基类库或其他Microsoft公开(和保护)的资源。或第三方图书馆。