Partilhar via


Adicionando suporte à segurança declarativa

Embora não seja estritamente exigido, uma permissão personalizada deve dar suporte a segurança declarativa para que sistema autônomo desenvolvedores podem especificar a permissão personalizada ao usar a sintaxe declarativa para ações de segurança, sistema autônomo solicitações, demandas ou declarações.Na verdade, solicitações de permissão, demandas, vincular e demandas de herança só podem ser feitas declarativamente.Por esse motivo, a permissão de acesso ao 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 que ativa o suporte de segurança declarativa sua permissão personalizada.

Observação:

Versão do atributo de personalizado permissão deve ser definido em um conjunto diferente do assembly no qual é referenciado.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 é carregado e o atributo não pode ter sido criado no momento que a referência é encontrada.Tentando usar uma permissão declarativa no mesmo assembly em que ele está definido resultados em um TypeLoadException que está sendo lançada.

Atributos de segurança para declarações precisam derivar (direta ou indiretamente) o SecurityAttribute classe. Se a permissão é uma permissão de acesso ao código, o atributo classe deriva de CodeAccessSecurityAttribute, que deriva de Segurança atributo.Classes de atributo de segurança devem implementar o 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 personalizadas deve ser marcada com o SerializableAttribute para ser serializado em metadados pelo compilador. Para obter mais informações, consulte Implementando uma permissão personalizada.

O código a seguir implementa uma classe de atributos de permissão booliano chamado CustomPermission. Neste exemplo, a classe de permissão tem um único booleana Unrestricted propriedade que contém seu 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 nesse caso, outras classes de atributo de permissão personalizada devem oferecer suporte a todos os estados possíveis dos objetos de permissão que dão suporte.

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

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

Consulte também

Conceitos

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

Implementando uma permissão personalizada

Referência

SecurityAttribute

CodeAccessSecurityAttribute

SerializableAttribute

Outros recursos

Estendendo metadados usando atributos

Segurança de Acesso de código