Richieste di collegamento

Aggiornamento: novembre 2007

Una richiesta di collegamento determina l'esecuzione di un controllo di sicurezza in fase di compilazione JIT, durante il quale viene esaminato solo l'assembly chiamante immediato del codice. Il collegamento si verifica quando il codice è associato a un riferimento a un tipo, quale un riferimento a un puntatore a funzione o una chiamata al metodo. Se l'assembly chiamante non dispone delle autorizzazioni sufficienti per collegarsi al codice, il collegamento non viene autorizzato e in fase di caricamento ed esecuzione del codice viene generata un'eccezione di runtime. Le richieste di collegamento possono essere sottoposte a override nelle classi che ereditano dal codice.

Mediante questo tipo di richiesta non viene eseguita un'analisi completa dello stack e permane il rischio che il codice sia soggetto ad attacchi subdoli. Ad esempio, se un metodo dell'assembly A è protetto da una richiesta di collegamento, verrà valutato un chiamante diretto nell'assembly B in base alle autorizzazioni di tale assembly, mentre non verrà valutato un eventuale metodo dell'assembly C se questo chiama indirettamente il metodo dell'assembly A tramite quello dell'assembly B. Per stabilire un collegamento al codice, nella richiesta di collegamento sono specificate solo le autorizzazioni di cui devono disporre i chiamanti diretti nell'assembly chiamante immediato. Non vengono specificate le autorizzazioni necessarie a tutti i chiamanti per l'esecuzione del codice.

I modificatori di percorso chiamate nello stack Assert, Deny e PermitOnly non influiscono sulla valutazione delle richieste di collegamento poiché queste non eseguono una verifica del percorso chiamate nello stack.

Se si accede a un metodo protetto da una richiesta di collegamento tramite reflection, viene controllato il chiamante immediato del relativo codice. Tale comportamento si verifica sia per l'individuazione che per la chiamata di metodi realizzate mediante reflection. Si supponga, ad esempio, che nel codice si utilizzi la reflection per restituire un oggetto MethodInfo che rappresenta un metodo protetto da una richiesta di collegamento. L'oggetto MethodInfo viene quindi passato ad altro codice, che lo utilizzerà per richiamare il metodo originale. In questo caso il controllo della richiesta di collegamento viene eseguito due volte: una sul codice che restituisce l'oggetto MethodInfo e l'altra sul codice che lo richiama.

Nota:

Una richiesta di collegamento effettuata su un costruttore di classe statico non consente di proteggere il costruttore, poiché i costruttori statici vengono chiamati dal sistema, all'esterno del percorso di esecuzione del codice dell'applicazione. Quando una richiesta di collegamento viene applicata a un'intera classe, tale richiesta non consente quindi di proteggere l'accesso a un costruttore statico, anche se consente di proteggere il resto della classe.

Nel frammento di codice seguente viene specificato in modo dichiarativo che è necessario che a ogni codice collegato al metodo ReadData sia assegnata l'autorizzazione CustomPermission. Si tratta di un'autorizzazione personalizzata fittizia, che non esiste realmente in .NET Framework. La richiesta viene specificata passando un flag SecurityAction.LinkDemand a CustomPermissionAttribute.

<CustomPermissionAttribute(SecurityAction.LinkDemand)> _
Public Shared Function ReadData() As String
    ' Access a custom resource.
End Function  
[CustomPermissionAttribute(SecurityAction.LinkDemand)]
public static string ReadData()
{
    // Access a custom resource.
}

Vedere anche

Concetti

Pretese di protezione

Creazione di autorizzazioni personalizzate di accesso al codice

Aggiunta del supporto della protezione dichiarativa

Altre risorse

Estensione di metadati mediante attributi

Protezione dall'accesso di codice