Выпуск декларативных атрибутов безопасности
Обновлен: Ноябрь 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, хранятся в старом формате.
Выпуск атрибутов декларативной безопасности
Атрибуты декларативной безопасности могут быть выпущены для сборок, типов, методов и конструкторов. Для всех типов элементов декларативная безопасность выпускается дл базовых методов.
Важное примечание. |
---|
Невозможно выпустить атрибуты декларативной безопасности посредством создания объектов PermissionSetAttribute и применения их к динамической сборке, типу или методу посредством использования метода SetCustomAttribute. |
Чтобы выпустить декларативную безопасность динамической сборки, создайте отдельные объекты PermissionSet, содержащие разрешения, которые являются необходимыми, дополнительными и отклоненными. Передайте эти наборы разрешений в соответствующую перегрузку метода DefineDynamicAssembly. Если отсутствуют разрешения, которые можно применить к категории, укажите для этого параметра значение null.
Важное примечание. Требуемые, дополнительные и отклоненные разрешения не используются, если только динамическая сборка не была сохранена и повторно загружена в память или если не используется перегрузка метода DefineDynamicAssembly, в которой указано свидетельство и требуемые разрешения, и не предоставляется объект Evidence. Дополнительные сведения см. в разделе DefineDynamicAssembly.
Чтобы выпустить декларативную безопасность для типов, методов и конструкторов в динамической сборке, создайте объект PermissionSet, содержащий разрешения для каждого применяемого SecurityAction. Примените разрешения с помощью метода AddDeclarativeSecurity класса TypeBuilder для типов, метода AddDeclarativeSecurity класса ConstructorBuilder для конструкторов и метода AddDeclarativeSecurity класса MethodBuilder для методов.
Примечание. Декларативная безопасность не поддерживается для динамических методов, определенных при помощи класса DynamicMethod.
Чтобы выпустить декларативную безопасность для всех прочих свойств и событий, примените необходимые наборы разрешений к базовому методу или методам с помощью метода AddDeclarativeSecurity класса MethodBuilder. Например, чтобы выпустить декларативную безопасность для свойства, примените декларативную безопасность к методам доступа get и set этого свойства.
В процессе разработки кода, создающего динамические сборки, рекомендуется использовать перегрузку метода DefineDynamicAssembly, задающую свидетельство и разрешения, предоставлять свидетельство, которое должна иметь динамическая сборка, и включать SecurityPermissionFlag.SkipVerification в refusedPermissions. Отказ в использовании SkipVerification гарантирует проверку MSIL. Ограничением этой методики является то, что она вызывает создание исключения SecurityException, когда используется с кодом, требующим полного доверия.