Adicionando suporte à segurança declarativa

Embora não estritamente necessária, uma permissão personalizado deve oferecer suporte à segurança declarativa de forma que os desenvolvedores podem especificar a permissão personalizado para usar a sintaxe declarativa para ações de segurança como solicitações, demandas, ou asserções. De fato, a permissão, requerem link, e as demandas de herança só poderão ser feitas declarativa imposta. Por esse motivo, a permissão de acesso a código personalizado não pode ser solicitada ou usado com as demandas de link ou demandas de herança a menos que você forneça suporte à segurança declarativa imposta. Este tópico descreve como implementar uma classe de Atributo que habilita o suporte declarativo de segurança da permissão personalizado.

Dica

A versão do atributo de permissão personalizado deve ser definida em um assembly diferente do assembly no qual é referenciado.A permissão personalizado também deve ser definida nesse assembly.Isso é obrigatório para segurança declarativa, como o atributo é executado quando o assembly é carregado, e o atributo pode não ter sido criado na referência a ele está localizada.Tentar usar uma permissão declarativa no mesmo assembly no qual é definida na TypeLoadException que está sendo lançada.

Os atributos de segurança para declarações deve derivar (direta ou indiretamente) da classe de SecurityAttribute . Se a permissão é uma permissão de acesso a código, a classe do atributo é derivado de CodeAccessSecurityAttribute, que se deriva de SecurityAttribute. As classes do atributo de segurança devem implementar o método de CreatePermission , que cria uma instância do objeto de permissão de permissão personalizado associado. Observe que essa classe de permissão personalizado associado deve ser marcada com SerializableAttribute para ser serializado em metadados pelo compilador. Para obter mais informações, consulte Implementando uma permissão personalizado.

O código a seguir implementa uma classe de atributo para uma permissão CustomPermissionbooliana nomeada. Neste exemplo, a classe tem uma única permissão de propriedade booliano de Unrestricted 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 a propriedade interna de Unrestricted e cria a instância adequada de um objeto de CustomPermission . Quando só a propriedade de Unrestricted é usada nesse caso, outras classes personalizadas do atributo de permissão devem oferecer suporte a todos os possíveis estados dos objetos de permissão que dão suporte ao.

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

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

Consulte também

Referência

SecurityAttribute

CodeAccessSecurityAttribute

SerializableAttribute

Conceitos

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

Implementando uma permissão personalizada

Outros recursos

Estendendo metadados por meio de atributos

Segurança de acesso do código