.NET DLR and SecurityException's

本文关键字:SecurityException DLR and NET | 更新日期: 2023-09-27 17:49:50

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));

谢谢。

.NET DLR and SecurityException's

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

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

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

相关文章:
  • 没有找到相关文章