在Sandbox模式下执行任意C#代码?

时间:2014-01-14 10:42:12

标签: c# asp.net asp.net-mvc c#-4.0 razorengine

我正在使用RazorEngine。我有一些动态模板,我将在运行时与视图模型绑定。我的要求是在沙箱中运行代码。因此,只允许绑定。 RazorEngine允许我使用

在任意app-domain中运行代码
using (var service = new IsolatedTemplateService(() => appDomain))
{
   return service.Parse(newTemplate, model, null, null);
}

如果我使用以下权限运行app-domain,那么它可以正常运行,

var permissionSet = new PermissionSet(PermissionState.Unrestricted);

但如果我使用这些权限运行它,

var permissionSet = new PermissionSet(PermissionState.None);
permissionSet.AddPermission(new SecurityPermission(PermissionState.Unrestricted));
permissionSet.AddPermission(new ReflectionPermission(PermissionState.Unrestricted));

我会得到,

[SecurityException: Request failed.]
   System.AppDomain.CreateInstance(String assemblyName, String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) +0
   RazorEngine.Templating.IsolatedTemplateService..ctor(Language language, Encoding encoding, IAppDomainFactory appDomainFactory) +408
   RazorEngine.Templating.IsolatedTemplateService..ctor(Language language, Encoding encoding, Func`1 appDomainFactory) +73
   RazorEngine.Templating.IsolatedTemplateService..ctor(Func`1 appDomainFactory) +41

我需要授予特殊许可吗?

2 个答案:

答案 0 :(得分:1)

不幸的是,CodeDOM API(可能是RazorEngine用来从Razor编译器生成的语法树生成C#代码)需要完全信任。除了强名称和GAC你的装配之外你没有什么可以做的,所以你得到了充分的信任。不幸的是,因为它需要整个“FullTrust”权限集,所以您不能仅仅授予特定权限。

答案 1 :(得分:0)

您可能拥有强名称程序集,需要应用AllowPartiallyTrustedCallers属性。

How to use the AllowPartiallyTrustedCallers attribute