在部分信任程序集调用的可信装配中授予FullTrust

时间:2010-03-05 14:54:07

标签: .net assemblies code-access-security full-trust partial-trust

想象以下环境:以部分信任模式运行的XBAP应用程序(默认行为;要求完全信任不是一个选项 - 但在您提出之前,如果对XBAP给予完全信任,那么一切按预期工作)引用本地安装的程序集,该程序集位于GAC中。为实现此目的,我们为本地程序集启用“AllowPartiallyTrustedCallers”选项,并且还授予完全信任。 (想象一下这是某种本地连接对应物)

(顺便说一下,我们知道使用AllowPartiallyTrustedCallers属性的安全方面,但这不在本文的范围之内,只是不在乎)

现在,即使我们的本地GAC程序集具有完全信任(我们可以随时通过调用Assembly.GetExecutingAssembly().IsFullyTrusted来检查这一点),它将无法满足任何要求(隐式或显式),因为它是由部分信任的调用者(我们的XBAP)调用。 (如果我误解了某些内容,请纠正我)。幸运的是,我们可以使用显式断言来获取本地GAC程序集中的权限,例如:

new System.Security.Permissions.FileIOPermission(.....).Assert();

通过这种方式,我们可以在此时阻止对完整堆栈的需求,并根据需要进行任何文件访问。 (再次,请纠正我......) 这实际上非常有效!(在这种情况下)

问题是,我们只是不做任何文件IO,事实上我们正在调用外部库,它应该能够做任何他们想要的事情(并且他们可能会做很多事情,访问注册表,发出Web服务请求,写文件,调用非托管代码 - 详细我们不知道,但我们可以信任它们),并防止需求堆栈走到我们部分信任的调用者。我们应该能够做到这一点,因为一切都是通过我们本地安装和信任的GAC组件完成的。 (再次,请不要关心这里的安全方面,只是假设,我们可以信任客户)

解决此问题的方法:

  • 我们首先想到的是,在使用外部库之前,几乎已经将一组权限(PermissionSet)声明为几乎任何权限。这几乎可以工作,但在某些时候看起来仍然会发生安全异常 - 或者,因为外部库可能会启动更多由于某种原因而失败的线程,或者因为它访问了entryassembly - 事实上,我们不知道。 / p>

  • 其次,我们尝试了以下语言

[System.Security.Permissions.PermissionSet(
  System.Security.Permissions.SecurityAction.Assert, Name = "FullTrust")]

它也不起作用。

  • 第三,我们考虑打开一个新的AppDomain,使完全受信任的GAC程序集成为AppDomains入口点,并在此appdomain中运行任何内容 - 任何堆栈遍历都不会再到达部分受信任的调用者 - 在我们的理论中) 。不幸的是,我们无法实现这一点......或者新创建的AppDomain失败了更多的需求,即使设置为在“MyComputer”安全区域下运行证据或不受限制的SecurityPermission。我无法明确授予对整个AppDomain的完全信任。

  • 第四,使用 caspol 不是一种选择。 (由于部署原因)

现在,由于这应该是很多信息,我希望你能理解我们想要存档的内容。

要明白这一点:完全受信任的程序集如何断言对其调用的程序集的完全完全信任,停止所有堆栈遍历以到达部分受信任的调用者?

很多先谢谢

1 个答案:

答案 0 :(得分:3)

查看Microsoft关于允许Partially Trusted Callers to Full Trust Assemblies的文档,我不相信这是可行的。

你一直强调我们需要避免安全问题,但实际上,你试图用你的解决方案做的事情是绕过.NET Framework中代码访问安全系统的每一部分,而且我我很难相信你将能够找到一个可行的解决方案。

除此之外,我无法想象这个过程确实需要以这种方式完成。

您是否无法从部分受信任的调用方卸载此处理,然后将通信传递给本地运行且已经信任的内容?