在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()
方法会导致代码访问安全性(CAS)停止在特定的权限检查请求上散步堆栈。
Assert是一种可以在代码访问权限类和PermissionSet类上调用的方法。 您可以使用Assert来使您的代码(和下游调用者)执行您的代码有权执行的操作,但调用者可能没有权限执行此操作。 安全声明更改了安全检查期间运行时执行的正常流程。 当您声明权限时,它会通知安全系统不要检查您的代码的调用者是否声明了权限。
使用Assert方法
我认为你想Demand()
出于兴趣:
下一篇: Should I git merge develop into master and then back after tagging?