Il codice SecurityTransparent, livello 1Security-Transparent Code, Level 1

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.

La trasparenza consente agli sviluppatori di scrivere in modo più sicuro le librerie .NET Framework che espongono funzionalità a codice parzialmente attendibile.Transparency helps developers write more secure .NET Framework libraries that expose functionality to partially trusted code. La trasparenza di livello 1 è stata introdotta in .NET Framework versione 2.0 ed è stata usata principalmente solo all'interno di Microsoft.Level 1 transparency was introduced in the .NET Framework version 2.0 and was primarily used only within Microsoft. A partire dal .NET Framework 4.NET Framework 4, è possibile utilizzare la trasparenza di livello 2.Starting with the .NET Framework 4.NET Framework 4, you can use level 2 transparency. Tuttavia, la trasparenza di livello 1 è stata conservata in modo che sia possibile identificare il codice legacy che deve essere eseguito con le regole di sicurezza precedente.However, level 1 transparency has been retained so that you can identify legacy code that must run with the earlier security rules.

Importante

È 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 usa AllowPartiallyTrustedCallersAttribute o non usa il modello di trasparenza.You should specify level 1 transparency for compatibility only; that is, specify level 1 only for code that was developed with the .NET Framework 3.5 or earlier that uses the AllowPartiallyTrustedCallersAttribute or does not use the transparency model. Usare ad esempio la trasparenza di livello 1 per assembly .NET Framework 2.0 che consentono l'uso di chiamate da chiamanti parzialmente attendibili (APTCA).For example, use level 1 transparency for .NET Framework 2.0 assemblies that allow calls from partially trusted callers (APTCA). Per il codice sviluppato per .NET Framework 4.NET Framework 4, usare sempre la trasparenza di livello 2.For code that is developed for the .NET Framework 4.NET Framework 4, always use level 2 transparency.

Di seguito sono elencate le diverse sezioni di questo argomento:This topic contains the following sections:

Modello di trasparenza di livello 1The Level 1 Transparency Model

Quando si usa la trasparenza di livello 1, si usa un modello di sicurezza che suddivide il codice in metodi SecurityTransparent, SecuritySafeCritical e SecurityCritical.When you use Level 1 transparency, you are using a security model that separates code into security-transparent, security-safe-critical, and security-critical methods.

È possibile contrassegnare un intero assembly, alcune classi di un assembly o alcuni metodi di una classe.You can mark a whole assembly, some classes in an assembly, or some methods in a class as security-transparent. Il codice SecurityTransparent non può elevare il livello di privilegi.Security-transparent code cannot elevate privileges. Questa restrizione implica tre conseguenze:This restriction has three consequences:

  • Il codice SecurityTransparent non può eseguire azioni Assert.Security-transparent code cannot perform Assert actions.

  • Tutte le richieste di collegamento soddisfatte dal codice SecurityTransparent diventano richieste complete.Any link demand that would be satisfied by security-transparent code becomes a full demand.

  • Il codice unsafe (non verificabile) che deve essere eseguito nel codice SecurityTransparent provoca una richiesta completa per l'autorizzazione di sicurezza UnmanagedCode.Any unsafe (unverifiable) code that must execute in security-transparent code causes a full demand for the UnmanagedCode security permission.

Queste regole vengono applicate durante l'esecuzione da Common Language Runtime (CLR).These rules are enforced during execution by the common language runtime (CLR). Il codice SecurityTransparent passa tutti i requisiti di sicurezza del codice richiamato ai relativi chiamanti.Security-transparent code passes all the security requirements of the code it calls back to its callers. Le richieste trasmesse con il codice SecurityTransparent non possono elevare il livello di privilegi.Demands that flow through the security-transparent code cannot elevate privileges. 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.If a low-trust application calls security-transparent code and causes a demand for high privilege, the demand will flow back to the low-trust code and fail. Il codice SecurityTransparent non può arrestare la richiesta perché non può eseguire azioni di asserzione.The security-transparent code cannot stop the demand because it cannot perform assert actions. Se lo stesso codice SecurityTransparent viene chiamato dal codice con attendibilità totale, la richiesta avrà esito positivo.The same security-transparent code called from full-trust code results in a successful demand.

SecurityCritical rappresenta l'opposto di SecurityTransparent.Security-critical is the opposite of security-transparent. Il codice SecurityCritical viene eseguito con attendibilità totale e può eseguire tutte le operazioni con privilegi.Security-critical code executes with full trust and can perform all privileged operations. 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 usare risorse per le quali non dispongono di autorizzazioni di accesso.Security-safe-critical code is privileged code that has been through an extensive security audit to confirm that it does not allow partially trusted callers to use resources they do not have permission to access.

È necessario applicare la trasparenza in modo esplicito.You have to apply transparency explicitly. 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.The majority of your code that handles data manipulation and logic can typically be marked as security-transparent, whereas the lesser amount of code that performs elevations of privileges is marked as security-critical or security-safe-critical.

Importante

La trasparenza di livello 1 è limitata all'ambito degli assembly e non viene applicata tra assembly.Level 1 transparency is limited to assembly scope; it is not enforced between assemblies. La trasparenza di livello 1 veniva usata principalmente da Microsoft per i controlli di sicurezza.Level 1 transparency was primarily used within Microsoft for security audit purposes. È possibile accedere ai tipi e ai membri SecurityCritical all'interno di un assembly di livello 1 dal codice SecurityTransparent di altri assembly.Security-critical types and members within a level 1 assembly can be accessed by security-transparent code in other assemblies. È importante eseguire richieste di collegamento per l'attendibilità totale in tutti i tipi e i membri SecurityCritical di livello 1.It is important that you perform link demands for full trust in all your level 1 security-critical types and members. 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.Security-safe-critical types and members must also confirm that callers have permissions for protected resources that are accessed by the type or member.

Per compatibilità con le versioni precedenti di .NET Framework, tutti i membri non annotati con attributi di trasparenza vengono considerati SecuritySafeCritical.For backward compatibility with earlier versions of the .NET Framework, all members that are not annotated with transparency attributes are considered to be security-safe-critical. Tutti i tipi non annotati vengono considerati Transparent.All types that are not annotated are considered to be transparent. Non ci sono regole di analisi statica per convalidare la trasparenza.There are no static analysis rules to validate transparency. Potrebbe quindi essere necessario eseguire il debug degli errori di trasparenza in fase di esecuzione.Therefore, you may need to debug transparency errors at run time.

Attributi di trasparenzaTransparency Attributes

Nella tabella riportata di seguito vengono descritti i tre attributi da usare per annotare il codice per la trasparenza.The following table describes the three attributes that you use to annotate your code for transparency.

AttributoAttribute DescrizioneDescription
SecurityTransparentAttribute Consentito solo a livello di assembly.Allowed only at the assembly level. Identifica tutti i tipi e i membri nell'assembly come SecurityTransparent.Identifies all types and members in the assembly as security-transparent. L'assembly non può contenere codice SecurityCritical.The assembly cannot contain any security-critical code.
SecurityCriticalAttribute Se usato 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.When used at the assembly level without the Scope property, identifies all code in the assembly as security-transparent by default, but indicates that the assembly may contain security-critical code.

Se usato a livello di classe, identifica la classe o il metodo come SecurityCritical, ma non i membri della classe.When used at the class level, identifies the class or method as security-critical, but not the members of the class. Per impostare tutti i membri come SecurityCritical, impostare la proprietà Scope su Everything.To make all the members security-critical, set the Scope property to Everything.

Se usato a livello di membro, l'attributo si applica solo a tale membro.When used at the member level, the attribute applies only to that member.

La classe o il membro identificato come SecurityCritical può eseguire le elevazioni dei privilegi.The class or member identified as security-critical can perform elevations of privilege. Importante: In trasparenza di livello 1, i tipi critici per la sicurezza e i membri vengono considerati come protezione SecuritySafeCritical quando vengono chiamati dall'esterno dell'assembly.Important: In level 1 transparency, security-critical types and members are treated as security-safe-critical when they are called from outside the 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.You should protect security-critical types and members with a link demand for full trust to avoid unauthorized elevation of privilege.
SecuritySafeCriticalAttribute Identifica codice SecurityCritical a cui è possibile accedere da codice SecurityTransparent nell'assembly.Identifies security-critical code that can be accessed by security-transparent code in the assembly. In caso contrario, il codice SecurityTransparent non può accedere ai membri SecurityCritical interni o privati nello stesso assembly.Otherwise, security-transparent code cannot access private or internal security-critical members in the same assembly. Questa operazione influisce sul codice SecurityCritical con conseguenti possibili elevazioni dei privilegi impreviste.Doing so would influence security-critical code and make unexpected elevations of privilege possible. Il codice SecuritySafeCritical deve essere sottoposto a un controllo di sicurezza rigido.Security-safe-critical code should undergo a rigorous security audit. Nota: sicurezza SecuritySafeCritical tipi e membri devono convalidare le autorizzazioni dei chiamanti per determinare se il chiamante dispone di autorizzazioni sufficienti per accedere alle risorse protette.Note: Security-safe-critical types and members must validate the permissions of callers to determine whether the caller has authority to access protected resources.

L'attributo SecuritySafeCriticalAttribute consente al codice SecurityTransparent di accedere ai membri SecurityCritical nello stesso assembly.The SecuritySafeCriticalAttribute attribute enables security-transparent code to access security-critical members in the same assembly. Considerare il codice SecurityTransparent e il codice SecurityCritical come se si trovassero in due assembly distinti.Consider the security-transparent and security-critical code in your assembly as separated into two assemblies. Il codice SecurityTransparent non riesce a vedere i membri privati o interni del codice SecurityCritical.The security-transparent code would not be able to see the private or internal members of the security-critical code. Inoltre, il codice SecurityCritical viene generalmente controllato per l'accesso all'interfaccia pubblica.Additionally, the security-critical code is generally audited for access to its public interface. Uno stato privato o interno non è normalmente accessibile all'esterno dell'assembly, quindi è consigliabile mantenere lo stato isolato.You would not expect a private or internal state to be accessible outside the assembly; you would want to keep the state isolated. 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.The SecuritySafeCriticalAttribute attribute maintains the isolation of state between security-transparent and security-critical code while providing the ability to override the isolation when it is necessary. Il codice SecurityTransparent non può accedere al codice SecurityCritical privato o interno, a meno che i membri non siano stati contrassegnati con SecuritySafeCriticalAttribute.Security-transparent code cannot access private or internal security-critical code unless those members have been marked with SecuritySafeCriticalAttribute. Prima di applicare l'attributo SecuritySafeCriticalAttribute, controllare il membro come se fosse esposto pubblicamente.Before applying the SecuritySafeCriticalAttribute, audit that member as if it were publicly exposed.

Annotazione a livello di assemblyAssembly-wide Annotation

La tabella seguente descrive gli effetti dell'uso di attributi di sicurezza a livello di assembly.The following table describes the effects of using security attributes at the assembly level.

Assembly (attributo)Assembly attribute Stato dell'assemblyAssembly state
Nessun attributo su un assembly parzialmente attendibileNo attribute on a partially trusted assembly Tutti i tipi e i membri sono Transparent.All types and members are transparent.
Nessun attributo su un assembly completamente attendibile (nella Global Assembly Cache o identificato come attendibilità totale in AppDomain)No attribute on a fully trusted assembly (in the global assembly cache or identified as full trust in the AppDomain) Tutti i tipi sono Transparent e tutti i membri sono SecuritySafeCritical.All types are transparent and all members are security-safe-critical.
SecurityTransparent Tutti i tipi e i membri sono Transparent.All types and members are transparent.
SecurityCritical(SecurityCriticalScope.Everything) Tutti i tipi e i membri sono SecurityCritical.All types and members are security-critical.
SecurityCritical Tutto il codice è Transparent per impostazione predefinita.All code defaults to transparent. I singoli tipi e membri possono tuttavia avere altri attributi.However, individual types and members can have other attributes.

Esempi di trasparenza della sicurezzaSecurity Transparency Examples

Per usare le regole di trasparenza di .NET Framework 2.0 (trasparenza di livello 1), usare l'annotazione di assembly seguente: To use the .NET Framework 2.0 transparency rules (level 1 transparency), use the following assembly annotation:

[assembly: SecurityRules(SecurityRuleSet.Level1)]  

Se si vuole 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:If you want to make a whole assembly transparent to indicate that the assembly does not contain any critical code and does not elevate privileges in any way, you can explicitly add transparency to the assembly with the following attribute:

[assembly: SecurityTransparent]  

Se si vuole 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:If you want to mix critical and transparent code in the same assembly, start by marking the assembly with the SecurityCriticalAttribute attribute to indicate that the assembly can contain critical code, as follows:

[assembly: SecurityCritical]  

Se si vogliono 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:If you want to perform security-critical actions, you must explicitly mark the code that will perform the critical action with another SecurityCriticalAttribute attribute, as shown in the following code example:

[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 Critical.The previous code is transparent except for the Critical method, which is explicitly marked as security-critical. La trasparenza rappresenta l'impostazione predefinita, anche con l'attributo SecurityCriticalAttribute a livello di assembly.Transparency is the default setting, even with the assembly-level SecurityCriticalAttribute attribute.

Vedere ancheSee Also

Codice SecurityTransparent, livello 2Security-Transparent Code, Level 2
Modifiche della sicurezzaSecurity Changes