2015-04-17 60 views
4

我有一個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中?

回答

0

事實證明,因爲我在現有的ASP.NET擁有的AppDomain內創建了一個AppDomain。 ASP.NET安裝自己AppDomainManager到父的AppDomain,並且除非像下面

AppDomainSetup appDomainSetup = new AppDomainSetup 
{ 
    ApplicationBase = applicationBasePath, 
    DisallowCodeDownload = true, 
    DisallowBindingRedirects = true, 
    DisallowPublisherPolicy = true, 
    LoaderOptimization = LoaderOptimization.MultiDomainHost, 
    AppDomainManagerAssembly = "", // overridden by caller 
    AppDomainManagerType = "" // overridden by caller 
}; 
1

通過nullsecurityInfo使用當前正在執行的AppDomain的證據。

AppDomain.CreateDomain

securityInfo

類型:System.Security.Policy.Evidence

證據表明規定,在應用領域運行的代碼的身份。傳遞null以使用當前的應用程序域的證據。

很可能需要加載System.Web.dll程序集來檢查其證據。

+0

我通過證據來電顯式覆蓋,這是自動傳播到孩子的AppDomain:有證據證明=新證據(); evidence.AddHostEvidence(新區域(SecurityZone.Untrusted));該方法。但它沒有任何區別。我仍然可以將System.Web.dll加載到新的AppDomain中。 –

相關問題