Aggiunta del supporto della protezione dichiarativa
Aggiornamento: novembre 2007
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.
Nota: |
---|
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
Concetti
Creazione di autorizzazioni personalizzate di accesso al codice
Implementazione di un'autorizzazione personalizzata