C# 在C中断言权限#
我正忙于理解c#中的安全性内容,我也在努力了解Assert是如何工作的。我正在使用.NET3.5 我制作了一个示例应用程序来尝试解决这个问题 调用方法: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.
[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以来,代码访问安全性已得到简化。谢谢!这有助于理解这一切