4

我有一些代码可以将 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 更改为: -

        PermissionSet permSet = new PermissionSet(PermissionState.Unrestricted);

所有代码都有效(但可能存在安全问题)

4

1 回答 1

1

当您尝试使用不同的权限集两次将程序集加载到现有 AppDomain 时,通常会发生此错误。100 万美元的问题是它是什么程序集,以及什么 AppDomain。

我对此没有完整的答案,但您可以查看以下内容:

  • 由于编组,哪些沙盒程序集(如果有)被加载到您的主应用程序域中?
  • 如果您有自己的服务器代码,它是否指定LoadOptimizationAttribute
  • 您的开发服务器和生产服务器是否使用不同的隔离级别?
  • 生产服务器上是否还有其他应用程序共享您的某些程序集?

您还可以尝试在服务器上安装远程调试运行时,将调试器附加到托管您的应用程序的进程,并直接检查在哪个域中加载了哪些内容。为此,您可能需要 SOS 调试扩展。

http://msdn.microsoft.com/en-us/library/bb190764.aspx

于 2013-07-05T21:13:33.957 回答