想象以下环境:在部分信任模式下运行的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。(由于部署原因)
现在,由于这应该是很多信息,我希望您了解我们要存档的内容。
为了明确这一点:完全受信任的程序集如何对其调用的程序集断言完全信任,停止所有堆栈遍历以到达部分受信任的调用者?
提前谢谢了