Override dei controlli di protezione

Aggiornamento: novembre 2007

Durante un controllo di protezione viene solitamente esaminato ogni chiamante compreso nello stack di chiamate per verificare che disponga dell'autorizzazione specificata. È tuttavia possibile eseguire l'override del risultato dei controlli di sicurezza chiamando i metodi Assert, Deny o PermitOnly su un singolo oggetto autorizzazioni o su un oggetto set di autorizzazioni. In base al metodo chiamato, il controllo di protezione avrà esito positivo o negativo, anche qualora non siano state controllate le autorizzazioni di tutti i chiamanti compresi nello stack.

Ogni volta che un metodo chiama un altro metodo, viene generato nello stack di chiamate un nuovo frame in cui memorizzare le informazioni relative al metodo chiamato. In questo contesto, l'utilizzo di costruttori e l'accesso a proprietà sono considerati chiamate al metodo. In ogni frame dello stack sono contenute informazioni sulle varie chiamate effettuate dal metodo ad Assert, Deny o a PermitOnly. Se un chiamante utilizza più di un Assert, Deny o PermitOnly nella stessa chiamata al metodo, in base all'ambiente di esecuzione vengono applicate le seguenti regole di elaborazione, in grado di influenzare il comportamento dell'override:

  • Se, durante l'analisi dello stack, viene rilevato più di un override dello stesso tipo, ad esempio due chiamate ad Assert, in uno stesso frame di stack, al secondo override verrà generata un'eccezione.

  • Quando nello stesso frame di stack sono presenti override differenti, tali override verranno elaborati nell'ordine seguente: prima PermitOnly, quindi Deny e infine Assert.

Per sostituire un override è necessario chiamare il metodo di annullamento appropriato, ad esempio RevertAssert, e quindi applicare il nuovo override.

Nota:

È necessario che gli override nell'analisi dello stack non vengano mai effettuati in un costruttore di classe, perché non vi è alcuna garanzia che il codice del costruttore venga eseguito in un determinato punto o in un particolare contesto. Dal momento che lo stato dello stack di chiamate in un costruttore di classe non è ben definito, gli override dell'analisi dello stack effettuati in costruttori possono produrre risultati inattesi e indesiderati.

L'utilizzo dei metodi Assert, Deny o PermitOnly non risulta solitamente necessario per gli sviluppatori di applicazioni e tali metodi vengono raramente utilizzati dagli sviluppatori di componenti e di librerie di classi. Tuttavia, gli override della protezione sono opportuni in determinate situazioni, descritte negli argomenti Assert, Deny e PermitOnly.

Nota:

Se si esegue un override (Deny, Assert o PermitOnly), annullare l'autorizzazione prima di eseguire lo stesso tipo di override nello stesso stack frame, ovvero nel metodo. In caso contrario, verrà generata un'eccezione SecurityException. Se, ad esempio, si nega un'autorizzazione P, annullarne la negazione prima di negare un'altra autorizzazione Q nello stesso metodo.

Utilizzare uno dei metodi statici elencati nella tabella riportata di seguito per annullare un override.

Metodo

Operazione

CodeAccessPermission.RevertAll

Provoca la rimozione di tutti i precedenti override per il frame corrente e li rende inefficaci.

CodeAccessPermission.RevertAssert

Provoca la rimozione dei precedenti Assert per il frame corrente e li rende inefficaci.

CodeAccessPermission.RevertDeny

Provoca la rimozione dei metodi Deny precedenti per il frame corrente e li rende inefficaci.

CodeAccessPermission.RevertPermitOnly

Provoca la rimozione dei metodi PermitOnly precedenti per il frame corrente e li rende inefficaci.

Vedere anche

Concetti

Scrittura di librerie di classi protette

Riferimenti

Utilizzo del metodo Assert

Utilizzo del metodo Deny

Utilizzo del metodo PermitOnly

Altre risorse

Protezione dall'accesso di codice