3

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

(顺便说一下,我们知道使用 AllowPartiallyTrustedCallers 属性的安全方面,但这超出了本文的范围,只是不关心)

现在,即使我们的本地 GAC 程序集完全信任(我们可以通过Assembly.GetExecutingAssembly().IsFullyTrusted随时调用来检查),它也会失败任何请求(隐式或显式),因为它是由部分信任的调用者(我们的 XBAP)调用的。(如果我误解了什么,请纠正我)。幸运的是,我们可以通过显式断言来获得本地 GAC 程序集内的权限,例如:

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

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

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

解决这个问题的方法:

  • 我们首先想到的是,在使用外部库之前,为几乎所有权限声明一组权限 (PermissionSet)。这几乎可以工作,但看起来在某些时候仍然会发生安全异常——要么是因为外部库可能会启动更多由于某种原因而失败的线程,要么是因为它访问了入口程序集——事实上,我们不知道。

  • 二、我们尝试了以下属性

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

它也没有用。

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

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

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

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

提前谢谢了

4

1 回答 1

3

查看微软关于允许部分信任的调用者完全信任程序集的文档,我不相信这是可能的。

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

On top of this, I can't imagine that this process is something that really needs to be done this way.

Couldn't you offload this processing from the partially trusted caller to then pass off communications to something running locally and already trusted?

于 2010-03-05T15:12:52.740 回答