8

我有两个 Web 应用程序(预编译的站点),一个是第一方的,将在完全信任的情况下运行。另一个是第三方,应该以部分信任(或具有特定权限)运行。

TrustedAssembly.Web.Pages.MyPage应该在完全信任的默认 AppDomain 中运行。 UntrustedAssembly.Web.Pages.SomePage应该在部分信任的 AppDomain 中运行。

此外,如果TrustedAssembly.Web.Pages.MyPage动态加载,是否UntrustedAssembly.Web.Controls.SomeControl可以在部分信任和/或特定权限下运行控件,而页面在完全信任下运行?

反之亦然,例如UntrustedAssembly.Web.Controls.SomePage动态加载TrustedAssembly.Web.Controls.MyControl,是否可以在页面在部分信任下运行时以完全信任的方式运行控件?

更新/仅供参考:这是.NET 4

4

2 回答 2

5

这样做可能有点棘手。以下是两种可能的思路:

第一种是在中等信任下运行应用程序,但是将您希望在 GAC 中完全信任运行的任何内容以及您希望在 bin 中以部分信任方式运行的任何内容。

请注意,在您的“反之亦然”场景中,受信任的控件可能需要执行安全“断言”,然后才能执行完全信任操作。例如

(new SecurityPermission(SecurityPermissionFlag.UnmanagedCode)).Assert();

第二个思路是在完全信任的情况下运行应用程序,然后使用自定义的证据加载您希望在中等信任下运行的任何程序集。例如

var evidence = new Evidence();
// Initialize the Evidence
Assembly.LoadFrom(path, evidence);

但请注意,正确设置 Evidence 对象并不适合胆小的人,而且我不确定我是否会走这条路。

不是一个完整的答案,但希望有一些想法可以带来一个:)

于 2011-06-19T02:59:35.953 回答
3

+1 to David Ebbo - 在部分信任下运行整个应用程序并提升来自 GACed 程序集的调用是唯一明智的方法。

还有一些需要考虑的点...

  • 没有多少类被设计为在 AppDomain 之间进行远程访问。ASP.Net 的不是很远程...
  • ASP.Net 控件与运行时有很多集成点。您需要构建非常有趣的代理类来正确限制控件和运行时之间的交互,以避免潜在的提升并具有正确的跨域编组。
  • 跨域边界从其他程序集中“泄漏”类很容易(从自定义位置进行自定义加载有助于通过使故障更加明显来防止“泄漏”)。使用具有很多扩展点(覆盖、事件)的框架,如 ASP.Net,可以提供更多跨域对象的机会。
  • this will not help you with running arbitrary code in your process - you declare trust (non-CLR sense) to custom code by simply loading into your process. I.e. StackOverflow is achivable by code that have just execute permissions and it will relably bring your process down.
于 2011-06-24T06:28:32.253 回答