在C#中断言权限

我忙于试图了解c#中的安全性内容,并且很努力地看到Assert是如何工作的。 我正在使用.net 3.5。

我做了一个示例应用程序来尝试解决这个问题。

调用方法:

[FileIOPermission(SecurityAction.Deny, ViewAndModify = @"C:")]
    static void Main(string[] args)
    {
        WriteTest testWriter = new WriteTest();
        testWriter.Test();
        Console.Read();
    }

在一个独立的班级图书馆,我有:

public class WriteTest
{
    public void Test()
    {
        try
        {
            FileIOPermission permission = new FileIOPermission(FileIOPermissionAccess.Write, @"C:");
            permission.Assert();
            using (StreamWriter sw = new StreamWriter(@"C:test.txt"))
            {
                sw.WriteLine("testing!");
                sw.Flush();
            }
            Console.WriteLine("Writen to file!");
        }
        catch (SecurityException sec)
        {
            Console.WriteLine("No privileges!");
        }
    }
}

此代码执行得很好,所有。 它会写入文件。 我的问题是这个工作到底如何? 这是否不会使安全类无效,如果我可以断言我想要的权限,以便它跳过检查? 如果我将Assert更改为Demand,则会引发异常。

安全课的重点是不允许我设置权限,以便当我打电话给第三方课时,我可以防止它流氓并做我不想做的事情? 我知道如果我在AppDomain中加载DLL,即使第三方DLL确实使用Assert,我也会得到这种效果,如果我直接调用它,这似乎很奇怪。 我试过阅读关于Assert的MSDN文档,但我发现很难理解。


当特权较低的代码(“Assembly A”)调用更多特权代码(“Assembly B”)执行某些任务时, Assert()非常有用。 要执行该任务,程序集B需要运行需要强大权限的代码 - 程序集A可能没有的权限。 因此,大会B首先要求功能较弱的权限(首先执行任务的权限),然后声明更强大的权限以实际执行任务。

例如,假设部分信任的Silverlight应用程序想要使用System.Net.WebRequest类发出HTTP请求。 建立网络连接需要SocketPermission ,但这是一个强大的低级权限,不应该授予来自Internet的不可信代码。 因此, WebRequest需要一个功能较弱的权限WebPermission ,然后在继续建立网络连接之前断言SocketPermission

现在,在您的特定示例中, Assert()覆盖Deny因为类库与应用程序在相同的特权级别运行 - 应用程序和类库都可能作为完全信任运行。 程序集总是可以在其授予集中Assert()任何权限。 要在类库上强制执行Deny ,您必须将类库放入沙箱中。

注意:在.NET 4.0中, Deny已被弃用。 来自MSDN Library:

为了执行Deny,RequestMinimum,RequestOptional和RequestRefuse权限请求,运行时支持已被删除。 总的来说,这些请求并没有被很好地理解,并且在没有正确使用时存在安全漏洞的可能性:

  • 拒绝操作可以轻松被Assert操作覆盖。 如果权限位于程序集的授予集中,程序集中的代码就能够执行Assert操作以获得权限。 Assert阻止了Deny在堆栈中被看到,使其无效。

  • Assert()方法会导致代码访问安全性(CAS)停止在特定的权限检查请求上散步堆栈。

    Assert是一种可以在代码访问权限类和PermissionSet类上调用的方法。 您可以使用Assert来使您的代码(和下游调用者)执行您的代码有权执行的操作,但调用者可能没有权限执行此操作。 安全声明更改了安全检查期间运行时执行的正常流程。 当您声明权限时,它会通知安全系统不要检查您的代码的调用者是否声明了权限。

    使用Assert方法

    我认为你想Demand()

    出于兴趣:

  • .NET Framework 4中的安全更改
  • 了解权限请求的工作方式
  • 链接地址: http://www.djcxy.com/p/57377.html

    上一篇: Assert Permissions in C#

    下一篇: Should I git merge develop into master and then back after tagging?