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