Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET是否按程序集更改每页的信任级别?_C#_Asp.net_Appdomain_Full Trust_Partial Trust - Fatal编程技术网

C# ASP.NET是否按程序集更改每页的信任级别?

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

我有两个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
,当页面在部分信任下运行时,是否可以完全信任地运行控件


更新/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可以通过具有“执行”权限的代码来实现,它会相应地降低您的进程

我喜欢从GAC运行第一方代码的想法,但我们需要积极拒绝SecurityPermission断言,因为授予的交互级别由最终用户在其隐私偏好中控制。例如,一个控件可能被授予x、y和z权限,而另一个控件可能只有x。加载带有证据的程序集可能是唯一的选项。你有没有关于这个主题的好文章,可以更详细地介绍一下——即关于从那个程序集加载控件以及运行时/编译时的含义?我找不到任何好的文章来讨论这个问题。棘手的是程序集通常是由ASP.NET加载的,因此您不能自己调用Load。驱动加载的一个选项可能是将程序集放置在其他文件夹(而不是bin)中,然后使用AssemblyResolve事件以您想要的方式加载它们。我可以(例如)将
FileIOPermission添加到
PermissionSet
并将权限集提供给
AppDomain.CreateDomain
方法,问题是,我无法附加到根AppDomain的AssemblyResolve事件以将其(程序集或类型)解析到AppDomain中运行的具有正确权限的“远程”实例。有什么想法吗?请注意,我不是建议进行任何跨域远程处理(请参阅Alexei的回复),只是在同一个域中以不同的方式加载一些程序集。您可以在域启动时注册AssemblyResolve(例如,从应用程序启动)。但请注意,我并不是在这里声称拥有完整的端到端解决方案,因为我没有这样做!这给了我很多思考,但我认为这让我走上了正确的道路。现在。。。大量的重新设计和重构。:)同意在appdomains之间使用远程处理可能不是一种可行的方法。
var evidence = new Evidence();
// Initialize the Evidence
Assembly.LoadFrom(path, evidence);