在 shell 应用程序中,我需要能够在运行时加载和执行其他 .NET 程序集,但不能完全信任它们。本质上,我想限制它们(加载的程序集)接触任何系统资源(线程、网络等),唯一的例外是隔离存储。但是,来自“我”的程序集需要完全信任地执行。
我一直在考虑代码访问安全性,但我不太确定它是我应该使用的。
你会怎么做?
在 shell 应用程序中,我需要能够在运行时加载和执行其他 .NET 程序集,但不能完全信任它们。本质上,我想限制它们(加载的程序集)接触任何系统资源(线程、网络等),唯一的例外是隔离存储。但是,来自“我”的程序集需要完全信任地执行。
我一直在考虑代码访问安全性,但我不太确定它是我应该使用的。
你会怎么做?
CAS 几乎就是您在这里所需要的。更具体地说,您希望将程序集加载到其自己的应用程序域中:
var myEvidence = new Evidence(new object[] {SecurityZone.Internet});
var newDomain = AppDomain.CreateDomain("InternetDomain");
myDomain.Load("MyUntrustedAssembly.dll", myEvidence);
myDomain.CreateInstanceAndUnwrap("MyUntrustedAssembly","MyUntrustedObjectType");
//do your work with the untrusted assembly/type
AppDomain.Unload(myDomain);
阅读应用程序域、各个区域以及分配给它们的默认权限集。Internet 是系统定义的区域/权限集中最严格的可用区域,程序集仍然可以在其中实际执行(还有受限区域;落入该区域的程序集无法运行)。您可以使用 .NET 配置工具来创建权限集并定义代码必须满足才能被授予权限集的条件(证据)。