我正在尝试了解FxCop CA2122消息(可能在禁用可怜的事情之前),而且我已经明显超越了我对.NET CAS的理解。
该应用程序是一个.EXE,不标有AllowPartiallyTrustedCallers。我们从代码分析中收到CA2122警告,抱怨我们无法将LinkDemands从最低级别的调用向上传播到本身具有LinkDemands的方法。
显然,我们可以将LinkDemands放在呼叫者身上,然后是呼叫者的呼叫者,ad-infinitum。这似乎完全没有用,因为每次调用此代码总是完全信任,因此(AIUI)无论如何总是会满足每个链接需求。 Eric Lippert似乎也认为这样做非常危险。
所以:
我错过了什么汇编级属性'这段代码只能以完全信任的方式运行'? (我认为没有AllowPartiallyTrustedCallers'暗示这一点,但也许不适用于.EXE)
或者我应该关闭那个CA警告并继续前进?我想在禁用它们之前正确理解它们......
更新:我被问到我们正在使用哪个框架版本 - 它是2.0RTM,而且升级到那个点是非常困难的,因为它是在XPe平台上。
答案 0 :(得分:2)
您的基本假设是程序集只能作为完全受信任的可执行文件运行,这是错误的。没有什么能阻止那些可以将你的程序集用作恶意软件中的引用库程序集的人。如果您更改了计算机的CAS策略以授予对程序集的完全信任,而不管其如何部署,则恶意软件可能会使用您的程序集执行操作,否则它将没有足够的权限。
这样做的结果是,无论您的预期部署方案如何,您都应该采取措施来阻止代表调用代码满足链接需求。鉴于您自己的目标是一个完整的信任场景,实际上这很容易。 但是,确切的方法在很大程度上取决于您要定位的.NET Framework版本,所以请您发布该详细信息吗?
对于.NET 2.0,解决该问题的最简单方法是将SecurityTransparentAttribute或SecurityCriticalAttribute应用于程序集。这两个属性都会导致程序集中的代码默认变为安全透明,这意味着它无法代表其调用者满足链接需求。如果您的代码的某些部分需要执行不允许安全透明代码的操作,则应在程序集级别使用SecurityCriticalAttribute而不是SecurityTransparentAttribute,因为这将允许您明确地将类型和/或成员提升为安全性 - 如果他们需要它的重要性。 (有关详细信息,请参阅http://blogs.msdn.com/b/shawnfa/archive/2005/08/31/when-the-opposite-of-transparent-isn-t-opaque.aspx。)
答案 1 :(得分:1)
如果我理解正确的话: http://msdn.microsoft.com/en-us/library/system.security.allowpartiallytrustedcallersattribute.aspx
链接需求属性告诉.NET强制执行该方法的完全信任规则。这也需要一个强大的名字。虽然您的应用树可能处于完全信任环境中,但没有任何内容可以强制执行公共/受保护方法和类的规则。
AllowPartiallyTrustedCallers告诉.NET你不关心谁调用它。
似乎.NET 4中的安全模型更改。