我正在研究代码访问安全性。我费了一番脑筋,所以我想我最终会使用 Reflector 并开始研究 .NET 4.0 如何使用安全属性。
观察
该System.IO.File.Delete
方法用[SecuritySafeCritical]
属性修饰。
该System.IO.File.Delete
方法委托给一个内部方法InternalDelete,该方法使用该[SecurityCritical]
属性进行修饰。
我在我的一个名为DeleteFile的 MVC 应用程序类中有一个方法,它正在运行SecurityTransparent
(我通过检查DeleteFile的 MethodInfo.IsSecurityCritical 属性进行了验证)
权限
根据我目前的理解,这意味着:
- System.IO.File.Delete 可以调用InternalDelete,因为
[SecuritySafeCritical]
方法可以调用[SecurityCritical]
,因此不会引发 SecurityException。 - DeleteFile可以调用 System.IO.File.Delete 因为
[SecurityTransparent]
可以调用[SecuritySafeCritical]
所以基本上,在不调整任何开箱即用的安全设置的情况下,这段代码将成功删除一个名为 test.txt 的虚拟文件
namespace MyTestMvcApp
{
public class FileHelpers()
{
// Has SecurityTransparent
public void DeleteFile()
{
// Will succesfully delete the file
File.Delete("test.txt");
}
}
}
混乱
在 的InternalDelete方法中System.IO.File.Delete
,它使用该CodeAccessPermission.Demand
方法检查堆栈上的所有调用者是否具有必要的权限。我不太明白的是 MSDN 文档中的这一行CodeAccessPermission.Demand
:
不检查调用该方法的代码的权限;检查从该代码的直接调用者开始,并继续向上堆栈。
所以我的问题是,如果我的应用程序的DeleteFile方法是SecurityTransparent
,为什么允许调用SecurityCritical
方法?
这可能是一个损坏的示例,可能缺少一些概念,但正如我所说,我仍在思考它,人们可以提供的任何见解越多,我就越会加深我的理解。
谢谢