首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建不带/empty CallContext的AppDomain

创建不带/empty CallContext的AppDomain
EN

Stack Overflow用户
提问于 2018-08-29 00:01:04
回答 1查看 132关注 0票数 0

在ASP.NET应用程序中,我想创建一个AppDomain,不受信任的代码将在其中运行。然而,在初始化和解包我的程序集加载器时,我没有传入的类型抛出了一个异常。它是来自web请求(HttpContext.Current.User)的当前用户,我认为它是通过LocalCallContext提供的。我不希望当前用户对不受信任的代码可用,事实上,我希望不受信任的代码完全没有上下文。所以我想我可以传入一个显式的CallContext,但是好像没有这样的东西。我将如何实现这一点?

不受信任的代码是用户提供的Razor模板,这些模板将通过RazorEngine执行。

代码语言:javascript
复制
Evidence evidence = new Evidence();
evidence.AddHostEvidence(new Zone(SecurityZone.Internet));
PermissionSet permissionSet = SecurityManager.GetStandardSandbox(evidence);
FileIOPermission permission = new FileIOPermission(PermissionState.None);
FileIOPermissionAccess access = FileIOPermissionAccess.Read | FileIOPermissionAccess.PathDiscovery;
permission.AddPathList(access, typeof(AssemblyLoader).Assembly.Location);
permissionSet.AddPermission(permission);

// We have to load ourself with full trust
StrongName loaderAssembly = typeof(AssemblyLoader).Assembly.Evidence.GetHostEvidence<StrongName>();
StrongName razorEngineAssembly = typeof(RazorEngineService).Assembly.Evidence.GetHostEvidence<StrongName>();
StrongName razorAssembly = typeof(RazorTemplateEngine).Assembly.Evidence.GetHostEvidence<StrongName>();
AppDomainSetup appDomainSetup = new AppDomainSetup
{
    ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase
};
AppDomain sandBoxDomain = AppDomain.CreateDomain("Razor Template Sandbox", null, appDomainSetup, permissionSet, loaderAssembly, razorEngineAssembly, razorAssembly);

AssemblyLoader loader = (AssemblyLoader)sandBoxDomain.CreateInstanceFromAndUnwrap(typeof(AssemblyLoader).Assembly.Location, typeof(AssemblyLoader).FullName);

最后一行抛出此异常,我的HttpContext.Current.User类型为UnrelatedAssembly.SomeType

代码语言:javascript
复制
System.Runtime.Serialization.SerializationException: 'Type is not resolved for member 'UnrelatedAssembly.SomeType,UnrelatedAssembly, Version=1.9.0.0, Culture=neutral, PublicKeyToken=null'.'
EN

回答 1

Stack Overflow用户

发布于 2018-09-03 02:18:27

我通过抑制执行上下文的流程,并从单独的线程运行目标应用程序域中的所有代码,解决了此问题的一部分。这看起来像这样:

代码语言:javascript
复制
var flow = ExecutionContext.SuppressFlow();
try
{
    return Task.Factory.StartNew(() =>
    {
        Thread.CurrentPrincipal = null;
        // setup app domain / run code in other app domain here
        return ....;
    }).Result;
}
finally
{
    flow.Undo();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52062025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档