Richieste di collegamentoLink Demands

Attenzione

Sicurezza dall'accesso di codice e codice parzialmente attendibileCode Access Security and Partially Trusted Code

.NET Framework fornisce un meccanismo denominato sicurezza dall'accesso di codice, che consente di applicare vari livelli di attendibilità a codice diverso in esecuzione nella stessa applicazione.The .NET Framework provides a mechanism for the enforcement of varying levels of trust on different code running in the same application called Code Access Security (CAS). La sicurezza per l'accesso di codice in .NET Framework non deve essere usata come meccanismo per l'applicazione dei limiti di sicurezza in base alla creazione di codice o altri aspetti di identità.Code Access Security in .NET Framework should not be used as a mechanism for enforcing security boundaries based on code origination or other identity aspects. Le linee guida sono state modificate per specificare che la sicurezza per l'accesso di codice e il codice SecurityTransparent non saranno supportati come limiti di sicurezza con codice parzialmente attendibile, soprattutto nel caso di codice di origine sconosciuta.We are updating our guidance to reflect that Code Access Security and Security-Transparent Code will not be supported as a security boundary with partially trusted code, especially code of unknown origin. Non è consigliabile caricare ed eseguire codice di origine sconosciuta in assenza di misure di sicurezza alternative.We advise against loading and executing code of unknown origins without putting alternative security measures in place.

Questi criteri si applicano a tutte le versioni di .NET Framework, ma non alla versione di .NET Framework inclusa in Silverlight.This policy applies to all versions of .NET Framework, but does not apply to the .NET Framework included in Silverlight.

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.A link demand causes a security check during just-in-time compilation and checks only the immediate calling assembly of your code. 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.Linking occurs when your code is bound to a type reference, including function pointer references and method calls. 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.If the calling assembly does not have sufficient permission to link to your code, the link is not allowed and a runtime exception is thrown when the code is loaded and run. Le richieste di collegamento possono essere sottoposte a override nelle classi che ereditano dal codice.Link demands can be overridden in classes that inherit from your code.

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.Note that a full stack walk is not performed with this type of demand and that your code is still susceptible to luring attacks. Ad esempio, se un metodo nell'assembly A è protetto da una richiesta di collegamento, un chiamante diretto nell'assembly B viene valutato in base alle autorizzazioni dell'Assembly B. Tuttavia, la richiesta di collegamento non restituirà un metodo nell'assembly C se il metodo chiamato indirettamente nell'assembly usando il metodo nell'assembly B. La richiesta di collegamento specifica che solo le autorizzazioni di indirizzare i chiamanti nell'assembly chiamante immediato devono avere il collegamento al codice.For example, if a method in assembly A is protected by a link demand, a direct caller in assembly B is evaluated based on the permissions of Assembly B. However, the link demand will not evaluate a method in assembly C if it indirectly calls the method in assembly A using the method in assembly B. The link demand specifies only the permissions direct callers in the immediate calling assembly must have to link to your code. Non vengono specificate le autorizzazioni necessarie a tutti i chiamanti per l'esecuzione del codice.It does not specify the permissions all callers must have to run your code.

I modificatori di percorso chiamate nello stack Assert, Deny e PermitOnly non influiscono sulla valutazione delle richieste di collegamento.The Assert, Deny, and PermitOnly stack walk modifiers do not affect the evaluation of link demands. poiché queste non eseguono una verifica del percorso chiamate nello stack.Because link demands do not perform a stack walk, the stack walk modifiers have no effect on link demands.

Se un metodo protetto da una richiesta di collegamento si accede attraverso Reflection, quindi una richiesta di collegamento viene controllato il chiamante immediato del codice tramite reflection.If a method protected by a link demand is accessed through Reflection, then a link demand checks the immediate caller of the code accessed through reflection. Tale comportamento si verifica sia per l'individuazione che per la chiamata di metodi realizzate mediante reflection.This is true both for method discovery and for method invocation performed using reflection. Si supponga ad esempio di codice Usa la reflection per restituire un MethodInfo dell'oggetto che rappresenta un metodo protetto da una richiesta di collegamento e quindi passa tale MethodInfo oggetto ad altro codice che utilizza l'oggetto per richiamare il metodo originale.For example, suppose code uses reflection to return a MethodInfo object representing a method protected by a link demand and then passes that MethodInfo object to some other code that uses the object to invoke the original method. In questo caso il controllo della richiesta di collegamento viene eseguito due volte: una volta per il codice che restituisce il MethodInfo oggetto e una volta per il codice che lo richiama.In this case the link demand check occurs twice: once for the code that returns the MethodInfo object and once for the code that invokes it.

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.A link demand performed on a static class constructor does not protect the constructor because static constructors are called by the system, outside the application's code execution path. 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.As a result, when a link demand is applied to an entire class, it cannot protect access to a static constructor, although it does protect the rest of the class.

Il frammento di codice seguente specifica in modo dichiarativo che a ogni codice collegato al metodo ReadData deve essere assegnata l'autorizzazione CustomPermission.The following code fragment declaratively specifies that any code linking to the ReadData method must have the CustomPermission permission. Questa autorizzazione è un'autorizzazione personalizzata ipotetica e non esiste in .NET Framework.This permission is a hypothetical custom permission and does not exist in the .NET Framework. La richiesta viene effettuata mediante il passaggio di un SecurityAction. LinkDemand flag per il CustomPermissionAttribute.The demand is made by passing a SecurityAction.LinkDemand flag to the 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 ancheSee also