.NET DLR и SecurityException - PullRequest
       25

.NET DLR и SecurityException

4 голосов
/ 13 апреля 2011

Какие обязательные элементы PermissionSet необходимы DLR для правильной работы?

Мы включили 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 Ответ

2 голосов
/ 13 апреля 2011

Причина, по которой вы не получаете более подробное исключение безопасности, заключается в том, что оно читается в контексте с ограниченными разрешениями CAS.Вы можете прочитать полную информацию об исключении, если вызовете его метод ToString в полностью доверенном контексте.

Тем не менее, я не могу воспроизвести ту же проблему в простом изолированном сценарии AppDomain, поэтому мне интересно, если вашИсключение действительно связано с использованием DLR.Что произойдет, если вы попытаетесь вызвать тот же метод в целевом экземпляре со строгой типизацией с тем же набором разрешений?

Например, я могу воспроизвести подобное исключение, если вызванный метод имеет LinkDemand для неограниченного набора разрешений.Эта проблема может быть замечена, хотя и с другим стеком вызовов, независимо от того, вызывается ли вызов динамической или строго типизированной переменной.

...