我有一個asp.net web API,它具有執行一些動態生成的DLL的邏輯。 我想創建一個具有受限權限集的新沙箱AppDomain來執行這些DLL。爲什麼新的AppDomain會加載不必要的DLL?
這是創建新的應用程序域限制的方法,包括:
public static AppDomain CreateRestrictedDomain(string applicationBasePath)
{
PermissionSet permissionSet = new PermissionSet(PermissionState.None);
permissionSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
permissionSet.AddPermission(new FileIOPermission(FileIOPermissionAccess.Read, applicationBasePath));
AppDomainSetup appDomainSetup = new AppDomainSetup
{
ApplicationBase = applicationBasePath,
DisallowCodeDownload = true,
DisallowBindingRedirects = true,
DisallowPublisherPolicy = true,
LoaderOptimization = LoaderOptimization.MultiDomainHost,
};
AppDomain restrictedDomain = AppDomain.CreateDomain(
friendlyName: "MySandbox",
securityInfo: null,
info: appDomainSetup,
grantSet: permissionSet,
fullTrustAssemblies: null);
return restrictedDomain;
}
,我已是第一次時,我引用新的AppDomain的問題,例如只是爲了讀取appDomain.FriendlyName,框架會嘗試將當前應用程序中存在的一些依賴加載到新的AppDomain中。如果依賴關係不在GAC中,它將嘗試在applicationBasePath中找到它們,並且它會失敗,因爲applicationBasePath設置爲只存儲不受信任的DLL的文件夾。
我的問題是爲什麼創建一個新的AppDomain觸發加載這些額外的依賴關係。在我上面的CreateRestrictedDomain方法中,沒有提及任何這些依賴關係。
我使用VS 2013中的默認模板創建了一個新的asp.net項目,並且在索引控制器中,我只是使用上面的代碼創建一個新的AppDomain並打印出名稱。下面的代碼:
public ActionResult Index()
{
var tempPath = Path.GetTempPath();
var untrustedPath = Path.Combine(tempPath, "unstrusted");
if (!Directory.Exists(untrustedPath))
{
Directory.CreateDirectory(untrustedPath);
}
var appDomain = AppDomainSandboxHelper.CreateRestrictedDomain(untrustedPath);
var friendlyName = appDomain.FriendlyName;
ViewBag.Title = friendlyName;
return View();
}
當我在調試模式下運行,我可以看到,上面寫着appDomain.FriendLyName行會觸發System.Web.dll程序被加載到新的AppDomain「MySandbox」
'iisexpress.exe' (CLR v4.0.30319: Domain 4): Loaded 'C:\windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll'. Symbols loaded.
'iisexpress.exe' (CLR v4.0.30319: MySandbox): Loaded 'C:\windows\Microsoft.Net\assembly\GAC_64\System.Web\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Web.dll'. Symbols loaded.
爲什麼需要將System.Web.dll加載到新的AppDomain中?
我通過證據來電顯式覆蓋,這是自動傳播到孩子的AppDomain:有證據證明=新證據(); evidence.AddHostEvidence(新區域(SecurityZone.Untrusted));該方法。但它沒有任何區別。我仍然可以將System.Web.dll加載到新的AppDomain中。 –