Condividi tramite


Aggiunta del supporto della protezione dichiarativa

Benché non sia obbligatorio, è consigliabile che un'autorizzazione personalizzata supporti la protezione dichiarativa, in modo che gli sviluppatori possano specificarla quando utilizzano la sintassi dichiarativa per azioni di protezione quali richieste, pretese o asserzioni. In realtà, le richieste di autorizzazione e le pretese di collegamento e di ereditarietà possono essere effettuate solo in modo dichiarativo. Non è quindi possibile utilizzare l'autorizzazione di accesso al codice personalizzata per le pretese di collegamento o di ereditarietà se non è disponibile il supporto della protezione dichiarativa. In questo argomento viene illustrato come implementare una classe Attribute che abilita il supporto della protezione dichiarativa per le autorizzazioni personalizzate.

È necessario che gli attributi di protezione per le dichiarazioni derivino, direttamente o indirettamente, dalla classe SecurityAttribute. Se l'autorizzazione è un'autorizzazione di accesso al codice, la classe di attributi deriva dalla classe CodeAccessSecurityAttribute, a sua volta derivata da SecurityAttribute. È necessario che le classi di attributi di protezioni implementino il metodo CreatePermission, che crea un'istanza dell'oggetto autorizzazione dall'autorizzazione personalizzata associata. È necessario che la classe di autorizzazioni personalizzata associata sia contrassegnata con l'attributo SerializableAttribute, affinché il compilatore possa serializzarla nei metadati. Per ulteriori informazioni, vedere Implementazione di un'autorizzazione personalizzata.

Mediante il codice riportato di seguito viene implementata una classe di attributi per un'autorizzazione Boolean denominata CustomPermission. Nell'esempio, la classe di autorizzazioni possiede un singola proprietà booleana Unrestricted contenente lo stato della classe.

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

In questo caso, CreatePermission controlla la proprietà interna Unrestricted e crea l'istanza appropriata di un oggetto CustomPermission. Mentre in questa situazione viene utilizzata solo la proprietà Unrestricted, è necessario che le altre classi di attributi di autorizzazioni personalizzate contemplino tutti gli stati possibili degli oggetti autorizzazioni supportati.

L'utilizzo di CustomPermissionAttribute viene illustrato nella seguente dichiarazione di pretesa:

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

Vedere anche

Riferimenti

SecurityAttribute Class
CodeAccessSecurityAttribute Class
SerializableAttribute Class

Concetti

Creazione di autorizzazioni personalizzate di accesso al codice
Implementazione di un'autorizzazione personalizzata

Altre risorse

Estensione di metadati mediante attributi
Protezione dall'accesso di codice