Compartilhar via


Adicionando suporte a segurança declarativa

Embora não seja estritamente necessário, uma permissão personalizada deve dar suporte a segurança declarativa para que os desenvolvedores podem especificar a permissão personalizada ao usar a sintaxe declarativa para ações de segurança como, por exemplo, solicitações, demandas ou declarações. Na verdade, solicitações de permissão, demandas, de link e demandas de herança só podem ser feitas declarativamente. Por esse motivo, a sua permissão de acesso de código personalizado não pode ser solicitada ou usado com as demandas de link ou demandas de herança, a menos que você fornecer suporte a segurança declarativa. Este tópico descreve como implementar um atributo classe habilita o suporte de segurança declarativa para a sua permissão personalizada.

Observação

A versão de atributo da permissão personalizada deve ser definida em um assembly diferente, por exemplo, o assembly no qual ela é referenciada.A permissão personalizada também deve ser definida no assembly.Isso é obrigatório para a segurança declarativa, porque o atributo é executado quando o assembly foi carregado e o atributo não pode ter sido criado no momento em que a referência é encontrada.Tentando usar uma permissão declarativa no mesmo assembly no qual ele está definido resulta em um TypeLoadException que está sendo lançada.

Atributos de segurança para declarações precisam derivar (direta ou indiretamente) a SecurityAttribute classe. Se a permissão é uma permissão de acesso ao código, a classe de atributo deriva de CodeAccessSecurityAttribute, que é derivada de SecurityAttribute. Classes de atributo de segurança devem implementar a CreatePermission método, que cria uma instância do objeto de permissão da permissão personalizada associada. Observe que isso associados a classe de permissão personalizada deve ser marcado com o SerializableAttribute para ser serializado em metadados pelo compilador. Para obter mais informações, consulte a implementação de uma permissão personalizada.

O código a seguir implementa uma classe de atributo de permissão booleano chamado CustomPermission. Neste exemplo, a classe de permissão tem um único booleano Unrestricted propriedade que contém o estado.

<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);
      }
   }
}

Nesse caso, CreatePermission verifica o interno Unrestricted propriedade e cria a instância apropriada de um CustomPermission objeto. Embora apenas o Unrestricted propriedade é usada neste caso, outras classes de atributo de permissão personalizada devem oferecer suporte a todos os estados possíveis da permissão objetos eles suporte.

O uso de CustomPermissionAttribute é ilustrada na seguinte declaração de demanda:

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

Consulte também

Referência

SecurityAttribute

CodeAccessSecurityAttribute

SerializableAttribute

Conceitos

Estendendo metadados usando atributos

Criando suas próprias permissões de acesso ao código

Segurança de Acesso de código

Implementando uma permissão personalizada