Condividi tramite


Codice SecurityTransparent, livello 1

La trasparenza consente agli sviluppatori di scrivere in modo più sicuro le librerie .NET Framework che espongono funzionalità a codice parzialmente attendibile. La trasparenza di livello 1 è stata introdotta in .NET Framework versione 2.0 ed è stata utilizzata principalmente solo all'interno di Microsoft. A partire da .NET Framework versione 4, è possibile utilizzare la trasparenza di livello 2. La trasparenza di livello 1 è tuttavia stata mantenuta per consentire di identificare il codice legacy che deve essere eseguito con regole di sicurezza meno recenti.

Nota importanteImportante

È necessario specificare la trasparenza di livello 1 solo per ragioni di compatibilità, ovvero specificare il livello 1 solo per codice sviluppato con .NET Framework 3.5 o versioni precedenti che utilizza AllowPartiallyTrustedCallersAttribute o non utilizza il modello di trasparenza.Utilizzare ad esempio la trasparenza di livello 1 per assembly .NET Framework 2.0 che consentono l'uso di chiamate da chiamanti parzialmente attendibili (APTCA).Per il codice sviluppato per .NET Framework 4, utilizzare sempre la trasparenza di livello 2.

Di seguito sono elencate le diverse sezioni di questo argomento:

  • Modello di trasparenza di livello 1

  • Attributi di trasparenza

  • Esempi di trasparenza della sicurezza

Modello di trasparenza di livello 1

Quando si utilizza la trasparenza di livello 1, si utilizza un modello di sicurezza che suddivide il codice in metodi SecurityTransparent, SecuritySafeCritical e SecurityCritical,

È possibile contrassegnare come SecurityTransparent un intero assembly, alcune classi di un assembly o alcuni metodi di una classe. Il codice SecurityTransparent non può elevare il livello di privilegi. Questa restrizione implica tre conseguenze:

  • Il codice SecurityTransparent non può eseguire azioni Assert.

  • Tutte le richieste di collegamento soddisfatte dal codice SecurityTransparent diventano richieste complete.

  • Il codice unsafe (non verificabile) che deve essere eseguito nel codice SecurityTransparent provoca una richiesta completa per l'autorizzazione di sicurezza UnmanagedCode.

Queste regole vengono applicate durante l'esecuzione da Common Language Runtime (CLR). Il codice SecurityTransparent passa tutti i requisiti di sicurezza del codice richiamato ai relativi chiamanti. Le richieste trasmesse tramite il codice SecurityTransparent non possono elevare il livello di privilegi. Se un'applicazione con attendibilità bassa chiama il codice SecurityTransparent e provoca una richiesta di un livello di privilegi più alto, la richiesta verrà trasferita di nuovo al codice con attendibilità bassa generando un errore. Il codice SecurityTransparent non può arrestare la richiesta perché non può eseguire azioni di asserzione. Se lo stesso codice SecurityTransparent viene chiamato dal codice con attendibilità totale, la richiesta avrà esito positivo.

SecurityCritical rappresenta l'opposto di SecurityTransparent. Il codice SecurityCritical viene eseguito con attendibilità totale e può eseguire tutte le operazioni con privilegi. Il codice SecuritySafeCritical è codice con privilegi che è stato sottoposto a un controllo di sicurezza completo per verificare che non consenta ai chiamanti parzialmente attendibili di utilizzare risorse per le quali non dispongono di autorizzazioni di accesso.

È necessario applicare la trasparenza in modo esplicito. La maggior parte del codice che gestisce la logica e la modifica dei dati può in genere essere contrassegnata come SecurityTransparent, mentre una quantità minore di codice che esegue le elevazioni dei privilegi viene contrassegnata come SecurityCritical o SecuritySafeCritical.

Nota importanteImportante

La trasparenza di livello 1 è limitata all'ambito degli assembly e non viene applicata tra assembly.La trasparenza di livello 1 veniva utilizzata principalmente da Microsoft per i controlli di sicurezza.È possibile accedere ai tipi e ai membri SecurityCritical all'interno di un assembly di livello 1 dal codice SecurityTransparent di altri assembly.È importante eseguire richieste di collegamento per l'attendibilità totale in tutti i tipi e i membri SecurityCritical di livello 1.I tipi e i membri SecuritySafeCritical devono inoltre verificare che i chiamanti dispongano di autorizzazioni per le risorse protette a cui il tipo o il membro accede.

Per compatibilità con le versioni precedenti di .NET Framework, tutti i membri non annotati con attributi di trasparenza vengono considerati SecuritySafeCritical. Tutti i tipi non annotati vengono considerati Transparent. Non vi sono regole di analisi statica per convalidare la trasparenza. Potrebbe pertanto essere necessario eseguire il debug degli errori di trasparenza in fase di esecuzione.

Attributi di trasparenza

Nella tabella riportata di seguito vengono descritti i tre attributi da utilizzare per annotare il codice per la trasparenza.

Attributo

Descrizione

SecurityTransparentAttribute

Consentito solo a livello di assembly. Identifica tutti i tipi e i membri nell'assembly come SecurityTransparent. L'assembly non può contenere codice SecurityCritical.

SecurityCriticalAttribute

Se utilizzato a livello di assembly, senza la proprietà Scope, identifica tutto il codice nell'assembly come SecurityTransparent per impostazione predefinita, ma indica che l'assembly può contenere codice SecurityCritical.

Se utilizzato a livello di classe, identifica la classe o il metodo come SecurityCritical, ma non i membri della classe. Per impostare tutti i membri come SecurityCritical, impostare la proprietà Scope su Everything.

Se utilizzato a livello di membro, l'attributo si applica solo a tale membro.

La classe o il membro identificato come SecurityCritical può eseguire le elevazioni dei privilegi.

Nota importanteImportante
Con la trasparenza di livello 1, i tipi e i membri SecurityCritical vengono trattati come SecuritySafeCritical quando vengono chiamati dall'esterno dell'assembly.È necessario proteggere i tipi e i membri SecurityCritical con una richiesta di collegamento per l'attendibilità totale, per evitare l'elevazione dei privilegi non autorizzata.

SecuritySafeCriticalAttribute

Identifica codice SecurityCritical a cui è possibile accedere da codice SecurityTransparent nell'assembly. In caso contrario, il codice SecurityTransparent non può accedere ai membri SecurityCritical interni o privati nello stesso assembly. Questa operazione influisce sul codice SecurityCritical con conseguenti possibili elevazioni dei privilegi impreviste. Il codice SecuritySafeCritical deve essere sottoposto a un controllo di sicurezza rigido.

NotaNota
I tipi e i membri SecuritySafeCritical devono convalidare le autorizzazioni dei chiamanti per determinare se il chiamante dispone dell'autorità per accedere alle risorse protette.

L'attributo SecuritySafeCriticalAttribute consente al codice SecurityTransparent di accedere ai membri SecurityCritical nello stesso assembly. Considerare il codice SecurityTransparent e il codice SecurityCritical come se si trovassero in due assembly distinti. Il codice SecurityTransparent non è in grado di vedere i membri privati o interni del codice SecurityCritical. Inoltre, il codice SecurityCritical viene generalmente controllato per l'accesso all'interfaccia pubblica. Uno stato privato o interno non è normalmente accessibile all'esterno dell'assembly, pertanto è consigliabile mantenere lo stato isolato. L'attributo SecuritySafeCriticalAttribute mantiene l'isolamento dello stato tra il codice SecurityTransparent e il codice SecurityCritical fornendo allo stesso tempo la possibilità di eseguire l'override dell'isolamento quando è necessario. Il codice SecurityTransparent non può accedere al codice SecurityCritical privato o interno, a meno che i membri non siano stati contrassegnati con SecuritySafeCriticalAttribute. Prima di applicare l'attributo SecuritySafeCriticalAttribute, controllare il membro come se fosse esposto pubblicamente.

Annotazione a livello di assembly

Nella tabella seguente vengono descritti gli effetti dell'utilizzo di attributi di sicurezza a livello di assembly.

Attributo dell'assembly

Stato dell'assembly

Nessun attributo su un assembly parzialmente attendibile

Tutti i tipi e i membri sono Transparent.

Nessun attributo su un assembly completamente attendibile (nella Global Assembly Cache o identificato come attendibilità totale in AppDomain)

Tutti i tipi sono Transparent e tutti i membri sono SecuritySafeCritical.

SecurityTransparent

Tutti i tipi e i membri sono Transparent.

SecurityCritical(SecurityCriticalScope.Everything)

Tutti i tipi e i membri sono SecurityCritical.

SecurityCritical

Tutto il codice è Transparent per impostazione predefinita. I singoli tipi e membri possono tuttavia avere altri attributi.

Esempi di trasparenza della sicurezza

Per utilizzare le regole di trasparenza di .NET Framework 2.0 (trasparenza di livello 1), utilizzare l'annotazione di assembly seguente:

[assembly: SecurityRules(SecurityRuleSet.Level1)]

Se si desidera rendere trasparente un intero assembly per indicare che l'assembly non contiene codice critico e non eleva in alcun modo i privilegi, è possibile aggiungere in modo esplicito la trasparenza all'assembly con l'attributo seguente:

[assembly: SecurityTransparent]

Se si desidera combinare codice critico e codice trasparente nello stesso assembly, contrassegnare l'assembly con l'attributo SecurityCriticalAttribute per indicare che l'assembly può contenere codice critico, come segue:

[assembly: SecurityCritical]

Se si desidera eseguire azioni SecurityCritical, contrassegnare in modo esplicito il codice che eseguirà l'azione critica con un altro attributo SecurityCriticalAttribute, come illustrato nell'esempio di codice seguente:

[assembly: SecurityCritical]
Public class A
{
    [SecurityCritical]
    private void Critical()
    {
        // critical
    }

    public int SomeProperty
    {
        get {/* transparent */ }
        set {/* transparent */ }
    }
}
public class B
{    
    internal string SomeOtherProperty
    {
        get { /* transparent */ }
        set { /* transparent */ }
    }
}

Il codice precedente è trasparente a eccezione del metodo Critical che è contrassegnato in modo esplicito come SecurityCritical. La trasparenza rappresenta l'impostazione predefinita, anche con l'attributo SecurityCriticalAttribute a livello di assembly.

Vedere anche

Concetti

Codice SecurityTransparent, livello 2

Modifiche della sicurezza in .NET Framework 4