Добавление поддержки декларативной безопасности

Хотя это и не является обязательным требованием, пользовательское разрешение должно поддерживать декларативную безопасность, чтобы разработчики могли указывать это пользовательское разрешение, используя декларативный синтаксис для таких действий безопасности, как запросы, требования или утверждения. На самом деле запросы разрешений, требования связывания и требования к наследованию могут выполняться только декларативно. Поэтому пользовательское разрешение доступа к коду не сможет быть запрошено и использовано в требовании связывания или требовании к наследованию. В данной теме описывается, как применять класс Attribute, добавляющий поддержку декларативной безопасности для вашего пользовательского разрешения.

ПримечаниеПримечание

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

Атрибуты безопасности для объявлений должны (прямо или косвенно) наследовать класс SecurityAttribute. Если разрешение является разрешением доступа к коду, класс атрибута должен наследовать класс CodeAccessSecurityAttribute, который наследуется от SecurityAttribute. Классы атрибутов безопасности должны реализовать метод CreatePermission, создающий экземпляр объекта разрешения из связанного пользовательского разрешения. Обратите внимание, что связанное пользовательское разрешение должно быть помечено атрибутом SerializableAttribute, чтобы иметь возможность сериализоваться компилятором в метаданные. Дополнительные сведения см. в разделе Реализация пользовательского разрешения.

Следующий код реализует класс атрибута для разрешения Boolean CustomPermission. В данном примере класс разрешения содержит единственное свойство Boolean — Unrestricted, хранящее его состояние.

<AttributeUsageAttribute(AttributeTargets.All, AllowMultiple := True)> Public Class 
CustomPermissionAttribute

   Inherits CodeAccessSecurityAttribute
   Private myUnrestricted As Boolean = False
   
   Public Shadows Property Unrestricted() As Boolean
      Get
         Return myUnrestricted
      End Get
      Set
         myUnrestricted = value
      End Set
   End Property
    
   Public Sub New(action As SecurityAction)
      MyBase.New(action)
   End Sub
   
   Public Overrides Function CreatePermission() As IPermission
      If Unrestricted Then
         Return New CustomPermission(PermissionState.Unrestricted)
      Else
         Return New CustomPermission(PermissionState.None)
      End If
   End Function
End Class
[AttributeUsageAttribute(AttributeTargets.All, AllowMultiple = true)]
public class CustomPermissionAttribute: CodeAccessSecurityAttribute
{
   bool unrestricted = false;

   public new bool Unrestricted
   {
      get{ return unrestricted; }
      set{ unrestricted = value; }
   }

   public CustomPermissionAttribute(SecurityAction action): base (action)
   {  
   }
   public override IPermission CreatePermission()
   {
      if(Unrestricted)
      {
         return new CustomPermission(PermissionState.Unrestricted);
      }
      else
      {
         return new CustomPermission(PermissionState.None);
      }
   }
}

В данном случае CreatePermission проверяет внутреннее свойство Unrestricted и создает соответствующий экземпляр объекта CustomPermission. Хотя в данном случае используется только свойство Unrestricted, другие классы атрибутов пользовательских разрешений должны поддерживать все возможные состояния объектов разрешений, поддерживаемых ими.

Использование атрибута CustomPermissionAttribute проиллюстрировано следующим объявлением требования:

<CustomPermissionAttribute(SecurityAction.Demand, Unrestricted := true)>
[CustomPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]

См. также

Ссылки

SecurityAttribute

CodeAccessSecurityAttribute

SerializableAttribute

Основные понятия

Расширение метаданных с помощью атрибутов

Создание собственных разрешений доступа к коду

Управление доступом для кода

Реализация пользовательского разрешения