.NET DLR和SecurityException

时间:2011-04-13 09:01:56

标签: c# .net dynamic dynamic-language-runtime securityexception

为了正常运作,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包含一系列详细信息,详细说明哪些权限导致其失败,但在这种情况下我们没有得到 - 非常烦人。

PS:如果我在我们的沙盒暂时授予PermissionSet(PermissionState.Unrestricted)的情况下运行相同的测试,则问题就会消失。但显然我们确实希望将其锁定到DLR所需的非常具体的权限集。

PPS:当前(失败的)PermissionSet创建如下:

var ps = new PermissionSet(PermissionState.None);
ps.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
ps.AddPermission(new ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess));

感谢。

1 个答案:

答案 0 :(得分:2)

您没有获得更详细的安全性异常的原因是它在具有受限CAS权限的上下文中被读取。如果在完全受信任的上下文中调用其ToString方法,则可以阅读完整的异常详细信息。

那就是说,我无法在简单的沙盒AppDomain场景中重现同样的问题,所以我想知道你的异常是否真的是由于DLR的使用。如果您尝试在同一权限集下的强类型目标实例上调用相同的方法会发生什么?

例如,如果被调用的方法具有不受限制的权限集的LinkDemand,我可以重新发出类似的异常。无论是对动态变量还是强类型变量的调用,都可以看到这个问题,尽管调用堆栈不同。