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