Aggiunta del supporto della sicurezza dichiarativa

Benché non sia obbligatorio, è consigliabile che un'autorizzazione personalizzata supporti la sicurezza dichiarativa, in modo che gli sviluppatori possano specificarla quando utilizzano la sintassi dichiarativa per azioni di sicurezza 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 sicurezza dichiarativa. In questo argomento viene illustrato come implementare una classe Attribute che abilita il supporto della sicurezza dichiarativa per le autorizzazioni personalizzate.

NotaNota

La versione attributo dell'autorizzazione personalizzata deve essere definita in un assembly diverso dall'assembly in cui si fa riferimento a tale autorizzazione.In questo assembly va definita anche l'autorizzazione personalizzata.Questa condizione è obbligatoria per la sicurezza dichiarativa, perché l'attributo, eseguito al caricamento dell'assembly, potrebbe non essere stato creato al momento del rilevamento del riferimento.Il tentativo di utilizzare un'autorizzazione dichiarativa nello stesso assembly nel quale è definita comporta la generazione di un oggetto TypeLoadException.

È necessario che gli attributi di sicurezza per le dichiarazioni derivino, direttamente o indirettamente, dalla classe SecurityAttribute. Se si tratta di un'autorizzazione di accesso al codice, la classe Attribute 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. Perché possa essere serializzata nei metadati dal compilatore, la classe di autorizzazioni personalizzata associata deve essere contrassegnata con SerializableAttribute. 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 pretesa dichiarativa:

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

Vedere anche

Riferimenti

SecurityAttribute

CodeAccessSecurityAttribute

SerializableAttribute

Concetti

Estensione di metadati mediante attributi

Creazione di autorizzazioni personalizzate di accesso al codice

Sicurezza dall'accesso di codice

Implementazione di un'autorizzazione personalizzata