Проблема безопасности при создании экземпляра класса в зоне интрасети .Net - PullRequest
0 голосов
/ 23 марта 2011

У меня есть элемент управления ActiveX .Net 2.0, который встроен в страницу HTML (в IE7).Я использую JavaScript для изменения его свойств и вызова методов.Все это нормально, пока я не вызову метод, который создает экземпляр класса с помощью Activator.CreateInstance (type).Я получаю следующее сообщение:

System.Reflection.TargetInvocationException: Исключение было сгенерировано целью вызова.---> System.Security.SecurityException: запрос не выполнен.
..
..
Сбой действия: InheritanceDemand
Тип первого неудачного разрешения: System.Security.PermissionSet
Зона сборки, в которой произошел сбой, была следующей: Intranet

Класс, который я пытаюсь создать, имеет конструктор public без паролей и от того, что я 'Вы читали, в любом случае не должно быть проблем с отражением в типах, которые являются публичными?

Я сделал временное исправление с помощью утилиты конфигурации Microsoft .NET Framework, чтобы полностью изменить доверие к интрасети.См. здесь .

Как я могу изменить метод, класс или сборку, чтобы избежать необходимости конфигурировать каркас?

Несколько дополнительных пунктов:

  • Элемент управления activex скомпилирован для .Net 2
  • Его сборка не является строгой с именем
  • Меня не беспокоит предоставление разрешений на отражение.

Спасибо

Обновление

Оказывается, проблема была не в отражении, а в вызове TypeDescriptor.GetAttributes, который вызвал исключение безопасности FileIOPermission.Я исправил это с помощью следующего кода:

Dim temp As New Security.Permissions.FileIOPermission(Security.Permissions.PermissionState.Unrestricted)
temp.Assert()
// Get attributes
System.Security.CodeAccessPermission.RevertAssert()

Теперь, если я установил группу кодов, назначенную строгому имени моей сборки, и установил разрешение на FullTrust ,все в порядке.
Тем не менее, я не могу точно настроить его, это либо FullTrust , либо выдается исключение (см. ниже).Даже набор разрешений Все не работает.

Исключение:

System.Security.SecurityException: Request failed.
at System.Reflection.CustomAttribute._CreateCaObject(Void* pModule, Void* pCtor, Byte** ppBlob, Byte* pEndBlob, Int32* pcNamedArgs)
at System.Reflection.CustomAttribute.CreateCaObject(Module module, RuntimeMethodHandle ctor, IntPtr& blob, IntPtr blobEnd, Int32& namedArgs)
at System.Reflection.CustomAttribute.GetCustomAttributes(Module decoratedModule, Int32 decoratedMetadataToken, Int32 pcaCount, RuntimeType attributeFilterType, Boolean mustBeInheritable, IList derivedAttributes)
at System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeType type, RuntimeType caType, Boolean inherit)
at System.RuntimeType.GetCustomAttributes(Type attributeType, Boolean inherit)
at System.ComponentModel.ReflectTypeDescriptionProvider.ReflectGetAttributes(Type type)
at System.ComponentModel.ReflectTypeDescriptionProvider.ReflectedTypeData.GetAttributes()
at System.ComponentModel.TypeDescriptor.TypeDescriptionNode.DefaultTypeDescriptor.System.ComponentModel.ICustomTypeDescriptor.GetAttributes()
at System.ComponentModel.TypeDescriptor.GetAttributes(Object component, Boolean noCustomTypeDesc)
at System.ComponentModel.TypeDescriptor.GetAttributes(Object component)
... GetAttributes
...
The action that failed was: InheritanceDemand
The type of the first permission that failed was: System.Security.PermissionSet
The Zone of the assembly that failed was: Intranet

Ответы [ 2 ]

2 голосов
/ 23 марта 2011

Я бы добавил атрибут ReflectionPermission в ваш файл AssemblyInfo.cs для сборки, пытающейся отразить в другом классе, с RequireMinimum SecurityAction.

Однако, имейте в виду, что все это будет делать, чтобы предотвратить ваше приложениеот бега в зоне интрасети, вместо того, чтобы бегать некоторое время, все кажется нормальным, пока не произойдет отражение.Утверждение разрешений не означает, что они будут предоставлены, это просто позволяет программе «быстро проваливаться».Вы можете требовать разрешения, сколько хотите;вся основа CAS в том, что его не нужно предоставлять вам.

Чтобы использовать отражение в вашем приложении или сборке, вы должны либо предоставить достаточные доказательства для запуска сборки в менее ограничивающемзоны (например, путем строгой подписи) или настройте платформу для включения ReflectionPermission в набор разрешений интрасети.

Наконец, имейте в виду, что декларативная модель безопасности CAS в значительной степени устарела в .NET Framework 4.0;если вы попытаетесь перенести этот код на .NET 4.0 позднее, вам придется изменить способ утверждения прав доступа.

1 голос
/ 24 марта 2011

У класса, который я пытаюсь создать, есть открытый конструктор без каких-либо ограничений, и из того, что я прочитал, не должно быть проблем с использованием отражения для типов, которые в любом случае являются публичными?

У вас не должно быть проблем с вызовом конструктора через отражение, если и класс, и конструктор являются публичными.Тем не менее, открытый конструктор закрытого класса по-прежнему создает проблему.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...