C# ASP.NET是否按程序集更改每页的信任级别?
我有两个web应用程序(预编译站点),一个是第一方,将完全信任地运行。另一个是第三方,应该以部分信任(或具有特定权限)运行C# ASP.NET是否按程序集更改每页的信任级别?,c#,asp.net,appdomain,full-trust,partial-trust,C#,Asp.net,Appdomain,Full Trust,Partial Trust,我有两个web应用程序(预编译站点),一个是第一方,将完全信任地运行。另一个是第三方,应该以部分信任(或具有特定权限)运行 TrustedAssembly.Web.Pages.MyPage应在完全信任的默认AppDomain中运行。 UntrustedAssembly.Web.Pages.SomePage应在部分信任的AppDomain中运行 此外,如果TrustedAssembly.Web.Pages.MyPage动态加载UntrustedAssembly.Web.Controls.SomeC
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
,当页面在部分信任下运行时,是否可以完全信任地运行控件
更新/FYI:这是.NET 4这样做可能有点棘手。以下是两种可能的思路: 第一种方法是以中等信任度运行应用程序,但将您想要运行的任何东西完全信任地放在GAC中,将您想要运行的东西部分信任地放在bin中 请注意,在“反之亦然”场景中,受信任控件可能需要执行安全“断言”,然后才能执行完全信任操作。e、 g
(new SecurityPermission(SecurityPermissionFlag.UnmanagedCode)).Assert();
第二条思路是在完全信任的情况下运行应用程序,但随后使用自定义配置加载任何希望在中等信任的情况下运行的程序集。e、 g
但是请注意,正确设置证据对象不适合心脏虚弱的人,我不确定我会走这条路
这不是一个完整的答案,但希望有一些想法能带来一个:)+1致David Ebbo-在部分信任的情况下运行整个应用程序,并提升GACed assembly的呼叫级别是唯一明智的方法 还有几点需要考虑
- 设计用于在AppDomains之间远程的类并不多。ASP.Net的不是很远程李>
- ASP.Net控件与运行时有很多集成点。您需要构建非常有趣的代理类来正确限制控件和运行时之间的交互,以避免潜在的提升,并进行正确的跨域编组
- 跨域边界从其他程序集中“泄漏”类很容易(从自定义位置自定义加载有助于通过使故障更明显来防止“泄漏”)。使用具有大量扩展点(覆盖、事件)的框架(如ASP.Net)可以使对象有更多机会跨域
- 这不会帮助您在流程中运行任意代码——您只需将代码加载到流程中,即可声明对自定义代码的信任(非CLR感知)。也就是说,StackOverflow可以通过具有“执行”权限的代码来实现,它会相应地降低您的进程
FileIOPermission添加到PermissionSet
并将权限集提供给AppDomain.CreateDomain
方法,问题是,我无法附加到根AppDomain的AssemblyResolve事件以将其(程序集或类型)解析到AppDomain中运行的具有正确权限的“远程”实例。有什么想法吗?请注意,我不是建议进行任何跨域远程处理(请参阅Alexei的回复),只是在同一个域中以不同的方式加载一些程序集。您可以在域启动时注册AssemblyResolve(例如,从应用程序启动)。但请注意,我并不是在这里声称拥有完整的端到端解决方案,因为我没有这样做!这给了我很多思考,但我认为这让我走上了正确的道路。现在。。。大量的重新设计和重构。:)同意在appdomains之间使用远程处理可能不是一种可行的方法。
var evidence = new Evidence();
// Initialize the Evidence
Assembly.LoadFrom(path, evidence);