在这段代码中,我希望禁止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 /存档/ 2004/08/25 / 220458.aspx

有帮助吗?

解决方案

随后的断言否定了拒绝的影响。

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

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

[assembly:FileIOPermission(SecurityAction.RequestRefuse, Unrestricted=true)]

其他提示

我认为您可能会误解断言权限的目的。当您在CAS中设置权限集时,您实际上是在说“我知道我正在做什么......我不关心权限在堆栈中更深层次。”那几乎从不你想要什么。您通常希望要求权限集。这会导致堆栈遍历,它会在堆栈上找到拒绝,然后导致安全异常。

然而,由于.NET实际上内置了所有必需的Demands,因此除非你正在进行Asserts(再次,这种情况很少见),或者你已经编写了自己的自定义Permission类,因此很少需要实际需要任何东西。 / p>

肯定是个好问题。我运行代码也有点神秘。 我只花了一个小时或两个小时研究文档和谷歌搜索但无济于事。请注意,MSDN通过对断言权限执行请求来解决问题。

编辑:二进制编码的答案指出了我正确的方向。

在全推力装配中,Asserion权利根本无效。仅当您在文件顶部添加以下内容时:

[assembly: SecurityPermissionAttribute(SecurityAction.RequestRefuse, Assertion = true)] 

对fileIo.Assert()的调用将失败。

但是,否则,尝试拒绝()断言权限和以下属性是完全无效的(除非您明确要求()断言权限。

[SecurityPermissionAttribute(SecurityAction.Deny, Assertion = true)]
private static void ReadFileSystem() {}

文档确实声明Assert()'存在一些安全问题',建议始终是Assert-Before-Assert:

fileIo.Demand();
fileIo.Assert();

但我仍然需要重新调整我对应用最小特权原则的看法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top