我有一些代码可以将 Razor 模板动态编译为我执行的程序集一组权限(无法访问文件等)。
这适用于我们的开发计算机和测试服务器(Windows 2008 IIS7 x64 .NET 4)。 但是在我们的生产服务器(相同规格)上,它给出了错误:
"加载此程序集将生成与其他实例不同的授权集。(HRESULT的例外情况:0x80131401)"
这是代码: -
public static SandboxContext Create(string pathToUntrusted, List<Assembly> references)
{
AppDomainSetup adSetup = new AppDomainSetup();
adSetup.ShadowCopyFiles = "true";
var dir = new DirectoryInfo(pathToUntrusted);
String tempPath = Path.Combine(Path.GetTempPath(), dir.Name + "_shadow");
adSetup.CachePath = tempPath;
// Our sandbox needs access to this assembly.
string AccessPath = Path.Combine(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath, "bin\CommonInterfaces.WebPages.dll");
System.IO.File.Copy(AccessPath, Path.Combine(pathToUntrusted, "CommonInterfaces.WebPages.dll"), true);
var baseDir = Path.GetFullPath(pathToUntrusted);
adSetup.ApplicationBase = baseDir;
adSetup.PrivateBinPath = baseDir;
adSetup.PartialTrustVisibleAssemblies =
new string[] {
typeof(System.Web.WebPageTraceListener).Assembly.FullName,
typeof(System.Web.Razor.RazorEngineHost).Assembly.FullName};
//Setting the permissions for the AppDomain. We give the permission to execute and to
//read/discover the location where the untrusted code is loaded.
PermissionSet permSet = new PermissionSet(PermissionState.None);
permSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
//We want the sandboxer assembly's strong name, so that we can add it to the full trust list.
StrongName fullTrustAssembly = typeof(Sandboxer).Assembly.Evidence.GetHostEvidence<StrongName>();
Evidence evidence = new Evidence();
//Now we have everything we need to create the AppDomain, so let's create it.
AppDomain newDomain = AppDomain.CreateDomain("Sandbox", evidence, adSetup, permSet, fullTrustAssembly);
ObjectHandle handle = Activator.CreateInstanceFrom(
newDomain, typeof(Sandboxer).Assembly.ManifestModule.FullyQualifiedName,
typeof(Sandboxer).FullName
);
//Unwrap the new domain instance into a reference in this domain and use it to execute the
//untrusted code.
var newDomainInstance = (Sandboxer)handle.Unwrap();
return new SandboxContext(newDomain, newDomainInstance);
}
知道为什么在一台服务器上会有所不同吗? 我刚刚在损坏的服务器上安装了所有未完成的Windows更新,但没有帮助。
如果我将权限集更改为:-
PermissionSet permSet = new PermissionSet(PermissionState.Unrestricted);
所有代码都有效(但可能存在安全问题)
当您尝试使用不同的权限集将程序集加载到现有 AppDomain 中两次时,通常会发生此错误。100万美元的问题是它是什么程序集,以及什么AppDomain。
我对此没有完整的答案,但您可以查看以下事项:
- 哪些沙盒程序集(如果有)由于封送而加载到主应用域中?
- 如果你有自己的服务器代码,它是否指定了 LoadOptimizationAttribute?
- 开发服务器和生产服务器是否使用不同的隔离级别?
- 生产服务器上是否有任何其他应用程序共享您的某些程序集?
还可以尝试在服务器上安装远程调试运行时,将调试器附加到承载应用程序的进程,并直接检查在哪个域中加载了哪些内容。为此,您可能需要 SOS 调试扩展。
http://msdn.microsoft.com/en-us/library/bb190764.aspx