设想
假设我们有下一个代码:
[SecuritySafeCritical]
public void SomeMethod()
{
SomeCriticalClass critical = new SomeCriticalClass();
Action someDelegate = () =>
{
critical.Do();
}
someDelegate();
}
SomeMethod
签名具有[SecuritySafeCritical]
属性。SomeCriticalClass
[SecurityCritical]
是在类或方法方法级别具有属性的某个类Do
。- 我们创建了一个匿名委托,自动推断为
Action
.
问题
调用critical.Do()
会导致 a ,因为安全透明方法(匿名方法)正在尝试访问安全关键字段(SomeCriticalClass 局部变量)。MethodAccessException
FieldAccessException
critical
问题
你是如何克服这一点的?
简单的方法是实现一个标记为的实际方法,[SecuritySafeCritical]
而不是使用匿名委托。但这使我们进入了匿名代表和lambas时代。我不想要这个。
其他简单的方法就是不使用安全透明性。这不是解决方案。
几乎所有来自 Microsoft 和开源社区的可用库在设计时都没有考虑到安全透明性。[SecuritySafeCritical]
也就是说,任何自己的自定义代码都必须通过方法[SecurityCritical]
/属性/委托与第三方库进行互操作。
实际上,我相信安全透明性是一个很好的工具,因为它可以强制进行更好和安全的软件设计,关键操作非常本地化,并且其余代码以最少的权限工作。