Поделиться через


Выпуск декларативных атрибутов безопасности

Обновлен: Ноябрь 2007

Выпуск декларативных атрибутов безопасности для динамических сборок и их типов и методов по функциям соответствует кодированию объявлений .permission и .permissionset для Ассемблер MSIL (Ilasm.exe) или применению атрибута PermissionSetAttribute в исходном коде для языков Visual Basic, C# и C++. Однако существуют отличие между форматом метаданных, используемым для сохранения выпущенных атрибутов, и форматом, используемым для хранения скомпилированных атрибутов, в зависимости от версии .NET Framework.

Форматы метаданных для декларативной безопасности

Новый формат метаданных для хранения атрибутов декларативной безопасности был представлен в изменениях 2005 года, затронувших стандарт ECMA и относившихся к исходному XML-формату. Подробности см. в описании большого двоичного объекта PermissionSet в таблице DeclSecurity (раздел 22.11 в изменениях 2005 года) документации ECMA, часть II. Часть II (на английском языке) доступна в Интернете на веб-узлах https://msdn.microsoft.com/net/ecma/ и http://www.ecma-international.org/publications/standards/Ecma-335.htm.

Во всех версиях .NET Framework декларативная безопасность, примененная с помощью порождения отражения, сохраняется в старом формате метаданных.

Разрешения декларативной безопасности в коде, скомпилированном с помощью Ассемблер MSIL (Ilasm.exe) и компиляторов языка в .NET Framework версии 2.0, хранятся в новом формате.

Разрешения декларативной безопасности в коде, скомпилированном с помощью Ассемблер MSIL (Ilasm.exe) и компиляторов языка в .NET Framework версий 1.0 и 1.1, хранятся в старом формате.

Выпуск атрибутов декларативной безопасности

Атрибуты декларативной безопасности могут быть выпущены для сборок, типов, методов и конструкторов. Для всех типов элементов декларативная безопасность выпускается дл базовых методов.

ms404249.alert_caution(ru-ru,VS.90).gifВажное примечание.

Невозможно выпустить атрибуты декларативной безопасности посредством создания объектов PermissionSetAttribute и применения их к динамической сборке, типу или методу посредством использования метода SetCustomAttribute.

  • Чтобы выпустить декларативную безопасность динамической сборки, создайте отдельные объекты PermissionSet, содержащие разрешения, которые являются необходимыми, дополнительными и отклоненными. Передайте эти наборы разрешений в соответствующую перегрузку метода DefineDynamicAssembly. Если отсутствуют разрешения, которые можно применить к категории, укажите для этого параметра значение null.

    ms404249.alert_caution(ru-ru,VS.90).gifВажное примечание.

    Требуемые, дополнительные и отклоненные разрешения не используются, если только динамическая сборка не была сохранена и повторно загружена в память или если не используется перегрузка метода DefineDynamicAssembly, в которой указано свидетельство и требуемые разрешения, и не предоставляется объект Evidence. Дополнительные сведения см. в разделе DefineDynamicAssembly.

  • Чтобы выпустить декларативную безопасность для типов, методов и конструкторов в динамической сборке, создайте объект PermissionSet, содержащий разрешения для каждого применяемого SecurityAction. Примените разрешения с помощью метода AddDeclarativeSecurity класса TypeBuilder для типов, метода AddDeclarativeSecurity класса ConstructorBuilder для конструкторов и метода AddDeclarativeSecurity класса MethodBuilder для методов.

    ms404249.alert_note(ru-ru,VS.90).gifПримечание.

    Декларативная безопасность не поддерживается для динамических методов, определенных при помощи класса DynamicMethod.

  • Чтобы выпустить декларативную безопасность для всех прочих свойств и событий, примените необходимые наборы разрешений к базовому методу или методам с помощью метода AddDeclarativeSecurity класса MethodBuilder. Например, чтобы выпустить декларативную безопасность для свойства, примените декларативную безопасность к методам доступа get и set этого свойства.

В процессе разработки кода, создающего динамические сборки, рекомендуется использовать перегрузку метода DefineDynamicAssembly, задающую свидетельство и разрешения, предоставлять свидетельство, которое должна иметь динамическая сборка, и включать SecurityPermissionFlag.SkipVerification в refusedPermissions. Отказ в использовании SkipVerification гарантирует проверку MSIL. Ограничением этой методики является то, что она вызывает создание исключения SecurityException, когда используется с кодом, требующим полного доверия.

См. также

Ссылки

DefineDynamicAssembly

ConstructorBuilder

TypeBuilder

MethodBuilder

PermissionSet