Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中断言权限#_C#_.net_Permissions_Code Access Security - Fatal编程技术网

C# 在C中断言权限#

C# 在C中断言权限#,c#,.net,permissions,code-access-security,C#,.net,Permissions,Code Access Security,我正忙于理解c#中的安全性内容,我也在努力了解Assert是如何工作的。我正在使用.NET3.5 我制作了一个示例应用程序来尝试解决这个问题 调用方法: [FileIOPermission(SecurityAction.Deny, ViewAndModify = @"C:\")] static void Main(string[] args) { WriteTest testWriter = new WriteTest(); testWriter.

我正忙于理解c#中的安全性内容,我也在努力了解Assert是如何工作的。我正在使用.NET3.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更改为request,它将抛出一个异常

安全类的目的是不允许我设置权限,这样当我调用第三方类时,我就可以防止它变成流氓,做我不想让它做的事情吗?我知道,如果我在AppDomain中加载dll,即使第三方dll使用Assert,我也会得到这种效果,但奇怪的是,如果我直接调用它,它就会工作。我曾尝试阅读有关Assert的MSDN文档,但我发现很难理解。

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

Assert是一种可以在代码访问权限上调用的方法 类和PermissionSet类上的。您可以使用Assert来启用 您的代码(和下游调用者)执行您的代码所允许的操作 具有执行权限,但其调用方可能没有执行权限。 安全断言会更改运行时运行的正常进程 在安全检查期间执行。当您断言一个权限时,它 告诉安全系统不要检查代码的调用方 声明的权限

我想你想要
Demand()

感兴趣的:

Assert()
在特权较低的代码(“程序集A”)调用特权较高的代码(“程序集B”)以执行某些任务时非常有用。要执行该任务,程序集B需要运行需要强大权限的代码,而程序集a可能没有这样的权限。因此,程序集B首先要求一个功能较弱的权限(首先是执行任务的权限),然后要求一个功能较强的权限来实际执行任务

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

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

注意:在.NET 4.0中,
Deny
已被弃用。发件人:

已删除执行拒绝、请求最小、请求可选和请求拒绝权限请求的运行时支持。一般来说,这些请求没有得到很好的理解,如果使用不当,可能会出现安全漏洞:

  • 拒绝操作可以很容易地被断言操作覆盖。如果权限在程序集的授予集中,则程序集中的代码能够对权限执行断言操作。断言阻止在堆栈上看到拒绝,使其无效

我确实理解它的作用,我只是不明白它为什么会这样。在我看来,Assert只是否定调用方设置的权限,这使得设置权限对我来说毫无意义。如果我导入某些第三方dll并将其设置为不具有写入权限(就像我在这里所做的那样),则第三方dll只能使用断言并获得写入权限?@DavidEsteves断言仅适用于在程序集级别已具有写入权限的dll(例如,它们位于AppDomain的完全信任程序集列表中)。简而言之,这意味着“用我的程序集级权限覆盖堆栈级权限”。我们有SecurityPermissionFlag.Assertion的枚举(在SecurityPermission类中使用),可以在新Appdomain的调用者中设置。它能防止第三方程序集断言吗?请确保您需要了解.NET 4之前的安全模型。。。自.NET 4.0以来,代码访问安全性已得到简化。谢谢!这有助于理解这一切