ASP.NET通过汇编改变每页的信任级别?

时间:2011-06-16 19:21:45

标签: c# asp.net appdomain full-trust partial-trust

我有两个网络应用程序(预编译网站),一个是第一方,将完全信任。另一个是第三方,应该部分信任(或具有特定权限)。

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

2 个答案:

答案 0 :(得分:5)

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

第一种是在中型信任中运行应用程序,但要将您想要在GAC中完全信任的任何内容放置在GAC中,以及您希望在bin中部分信任的内容中运行。

请注意,在“反之亦然”方案中,受信任控件可能需要在能够执行完全信任操作之前执行安全性“断言”。 e.g。

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

第二种思路是以完全信任的方式运行应用程序,然后使用自定义Evidence加载要在中等信任中运行的任何程序集。 e.g。

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

但请注意,正确设置Evidence对象不适合胆小的人,而且我不确定我会不会那样做。

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

答案 1 :(得分:3)

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

要考虑的更多要点......

  • AppDomains之间没有多少类可以远程控制。 ASP.Net的不是很远的......
  • ASP.Net控件与运行时有很多集成点。您需要构建非常有趣的代理类来正确地限制控件和运行时之间的交互,以避免潜在的高程并具有正确的跨域编组。
  • 很容易泄漏"跨域边界的其他程序集中的类(从自定义位置自定义加载有助于防止"泄漏"使故障更明显)。使用带有很多扩展点(覆盖,事件)的框架,比如ASP.Net,可以为跨域提供更多的对象。
  • 这对您在流程中运行任意代码没有帮助 - 您只需加载到流程中即可向自定义代码声明信任(非CLR意义)。即StackOverflow可以通过具有执行权限的代码来实现,并且可以使您的进程失效。