Partager via


Ajout de la prise en charge de la sécurité déclarative

Mise à jour : novembre 2007

Bien que ce ne soit pas strictement obligatoire, une autorisation personnalisée doit prendre en charge la sécurité déclarative de manière à ce que les développeurs puissent spécifier l'autorisation personnalisée lors de l'utilisation de la syntaxe déclarative pour les actions de sécurité telles que demandes ou assertions. En fait, les demandes d'autorisation, de liaison et d'héritage ne peuvent être faites que de manière déclarative. Pour cette raison, votre autorisation d'accès du code personnalisée ne peut pas être demandée ni utilisée avec les demandes de liaison ou d'héritage à moins que vous ne fournissiez la prise en charge pour la sécurité déclarative. Cette rubrique décrit comment implémenter une classe Attribute qui permet la prise en charge de la sécurité déclarative pour votre autorisation personnalisée.

Remarque :

La version avec attributs de l'autorisation personnalisée doit être définie dans un assembly différent de celui dans lequel elle est référencée. L'autorisation personnalisée doit également être définie dans cet assembly. Ceci est obligatoire pour la sécurité déclarative, car l'attribut est exécuté lorsque l'assembly est chargé, et l'attribut n'a peut-être pas été créé au moment où la référence à cet attribut a été rencontrée. Toute tentative d'utiliser une autorisation déclarative dans le même assembly que celui dans lequel elle est définie entraîne la levée d'une TypeLoadException.

Les attributs de sécurité pour les déclarations doivent dériver (directement ou indirectement) de la classe SecurityAttribute. Si l'autorisation est une autorisation d'accès du code, la classe d'attributs dérive de CodeAccessSecurityAttribute, qui dérive de SecurityAttribute. Les classes d'attributs de sécurité doivent implémenter la méthode CreatePermission, qui crée une instance de l'objet d'autorisation à partir de l'autorisation personnalisée associée. Notez que cette classe d'autorisation personnalisée associée doit être marquée avec la SerializableAttribute afin d'être sérialisée dans les métadonnées par le compilateur. Pour plus d'informations, consultez Implémentation d'une autorisation personnalisée.

Le code suivant implémente une classe d'attributs pour une autorisation booléenne nommée CustomPermission. Dans cet exemple, la classe d'autorisations a une propriété Unrestricted booléenne unique qui contient son état.

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

Dans ce cas, CreatePermission vérifie la propriété Unrestricted interne et crée l'instance appropriée d'un objet CustomPermission. Bien que seule la propriété Unrestricted soit utilisée dans ce cas, d'autres classes d'attributs d'autorisation personnalisées devraient prendre en charge tous les états possibles des objets d'autorisation qu'ils supportent.

L'utilisation de CustomPermissionAttribute est illustrée dans la déclaration de demande suivante :

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

Voir aussi

Concepts

Création de vos propres autorisations d'accès du code

Implémentation d'une autorisation personnalisée

Référence

SecurityAttribute

CodeAccessSecurityAttribute

SerializableAttribute

Autres ressources

Extension des métadonnées à l'aide des attributs

Sécurité d'accès du code