.NET DLR和SecurityException的问题

4

DLR需要哪些强制性的PermissionSet项目才能正常运行?

我们已经在沙盒脚本环境中启用了DLR。但是像以下代码这样的一些代码......

dynamic foo = someobject
foo.FooBar();

仅仅这样会导致一个相当模糊和“未完成”的异常被抛出,如下所示:
System.Security.SecurityException: Request failed.
   at CallSite.Target(Closure , CallSite , Object )
   at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid1[T0](CallSite site, T0 arg0)
   at AcmeCorp.AcmeRocket.Workflow.Scripting.Assemblies.WorkflowScriptImplementation.Test()
   at AcmeCorp.AcmeRocket.Workflow.Scripting.Assemblies.WorkflowScriptImplementation.__action_activity_4397110c5d7141a6802a070d3b942b77()
   --- End of inner exception stack trace ---
   at AcmeCorp.AcmeRocket.Workflow.Scripting.WorkflowScriptProxy.Invoke(String method_name)
   at AcmeCorp.AcmeRocket.Workflow.Execution.Executors.ActionActivityExecutor.Execute(WorkflowInstance wi, ActionActivity activity)
   at AcmeCorp.AcmeRocket.Workflow.Execution.ActivityExecutorBase.Execute(WorkflowInstance wi, Activity activity)
   at AcmeCorp.AcmeRocket.Workflow.Execution.WorkflowExecutor.ExecuteActivity(WorkflowInstance wi, Activity activity)
   at AcmeCorp.AcmeRocket.Workflow.Execution.WorkflowExecutor.Execute(WorkflowInstance wi, Nullable`1 branch_index)

通常情况下,SecurityException会包含大量详细信息,明确说明哪些权限导致了失败,但在这种情况下,我们没有得到那些信息 - 非常恼人。
附注:如果我暂时使用PermissionSet(PermissionState.Unrestricted)授予沙盒相同的测试,则问题消失。但是,显然我们真正想要锁定的是DLR所需的非常特定的权限集。
附注2:当前(失败的)PermissionSet的创建方式如下:
var ps = new PermissionSet(PermissionState.None);
ps.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
ps.AddPermission(new ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess));

感谢您的选择。
1个回答

2
您没有获得更详细的安全异常信息的原因是它在具有受限CAS权限的上下文中被读取。如果您在完全受信任的上下文中调用其ToString方法,则可以阅读完整的异常详细信息。
话虽如此,我无法在简单的沙盒AppDomain场景中复现相同的问题,所以我想知道您的异常是否真的是由DLR使用引起的。如果您尝试在相同的权限集下对强类型目标实例调用相同的方法会发生什么?
例如,如果调用的方法对无限制权限集有LinkDemand,则可以重现类似的异常。无论是针对动态变量还是强类型变量的调用,都可以看到这个问题,尽管调用堆栈不同。

有时候像这篇文章一样的第二个意见就足以找到解决方案。结果发现我的汇编(在我的例子中,someobject 来源于此)缺少了 "AllowPartiallyTrustedCallersAttribute" 标记。我很生气自己没有早点检查和反复确认这个问题。 - nbevans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接