4

在这段代码中,我希望禁止 ReadFileSystem 方法在文件系统上声明权限。

我预计这会抛出 fileIo.Assert(),但事实并非如此。为什么?

using System.Security.Permissions;
static void Main(string[] args)
{
    var fileIo = new FileIOPermission(PermissionState.Unrestricted);
    var secuPerm = new SecurityPermission(SecurityPermissionFlag.Assertion);
    PermissionSet set = new PermissionSet(PermissionState.Unrestricted);
    set.AddPermission(fileIo);
    set.AddPermission(secuPerm);
    set.Deny();
    ReadFileSystem();
    Console.Read();
}

private static void ReadFileSystem()
{
    var fileIo = newFileIOPermission(PermissionState.Unrestricted);
    fileIo.Assert();

    DirectoryInfo dir = new DirectoryInfo("C:/");
    dir.GetDirectories();
}

更新

CAS 上的精彩链接:http: //blogs.msdn.com/shawnfa/archive/2004/08/25/220458.aspx

4

2 回答 2

8

随后的 Assert 否定了 Deny 的效果。

断言 FileIOPermission 的能力主要取决于您的程序集是否受信任。它不受先前拒绝 FileIOPermission 的影响。事实证明,它也不受前面的 Deny of the Assertion SecurityPermission 的影响。这是因为 SecurityPermissionFlag.Assertion 被检查为链接时间需求。这没有明确记录;我在这里找到了。

要强制 CLR 不信任您的程序集的 FileIOPermission,您可以在 using 语句之后在文件顶部使用以下内容。当您将此添加到文件中时,断言将不会生效。这会影响整个装配。没有更精细的粒度。

[assembly:FileIOPermission(SecurityAction.RequestRefuse, Unrestricted=true)]
于 2009-03-08T01:33:49.807 回答
2

我想你可能误解了 Asserting permissions 的目的。当您在 CAS 中声明权限集时,您实际上是在说“我知道我在做什么......我不在乎权限在堆栈中的深度是什么”。这几乎不是你想要的。您通常希望请求权限集。这会导致堆栈遍历,它会在堆栈上找到拒绝,然后导致安全异常。

但是,由于 .NET 几乎内置了所有必需的 Demand,因此几乎不需要实际 Demand 任何东西,除非您正在执行 Asserts(同样,这种情况很少见)或者您已经编写了自己的自定义 Permission 类。

于 2009-03-08T10:15:59.163 回答