Ajout de la prise en charge de la sécurité déclarative
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.
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'attribut dérive de CodeAccessSecurityAttribute, qui dérive de SecurityAttribute. Les classes d'attribut 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'autorisations personnalisée associée doit être marquée avec 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'attribut 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'attribut 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
Référence
SecurityAttribute Class
CodeAccessSecurityAttribute Class
SerializableAttribute Class
Concepts
Création de vos propres autorisations d'accès du code
Implémentation d'une autorisation personnalisée
Autres ressources
Extension des métadonnées à l'aide des attributs
Sécurité d'accès du code