0

我编写了以下代码来测试 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 的教程,他们使用命令式/声明式安全来使用 CAS。但从上面的示例来看,似乎没有必要。

如果我故意编写没有命令式/声明式安全性的代码并且不为我的程序集提供任何证据,那么 CAS 会盲目执行任何安全策略吗?

还是我误解了 CAS 的预期用途?

谢谢。

4

1 回答 1

1

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

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

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

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

于 2010-10-04T12:15:17.253 回答