Codice SecurityTransparent, livello 2Security-Transparent Code, Level 2

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 di livello 2 è stata introdotta in .NET Framework 4.NET Framework 4.Level 2 transparency was introduced in the .NET Framework 4.NET Framework 4. I tre concetti principali di questo modello sono il codice Transparent, il codice SecuritySafeCritical e il codice SecurityCritical.The three tenets of this model are transparent code, security-safe-critical code, and security-critical code.

  • Il codice Transparent, incluso il codice in esecuzione con attendibilità totale, può chiamare solo altro codice Transparent o codice SecuritySafeCritical.Transparent code, including code that is running as full trust, can call other transparent code or security-safe-critical code only. Può eseguire solo azioni consentite dal set di autorizzazioni parzialmente attendibile, se esistente, del dominio.It can only perform actions allowed by the domain’s partial trust permission set (if one exists). Il codice Transparent non può eseguire le operazioni seguenti:Transparent code cannot do the following:

    • Eseguire un metodo Assert o un'elevazione dei privilegi.Perform an Assert or elevation of privilege.

    • Contenere codice di tipo unsafe o non verificabile.Contain unsafe or unverifiable code.

    • Chiamare direttamente codice Critical.Directly call critical code.

    • Chiamare codice nativo o codice con l'attributo SuppressUnmanagedCodeSecurityAttribute.Call native code or code with the SuppressUnmanagedCodeSecurityAttribute attribute.

    • Chiamare un membro protetto da LinkDemand.Call a member that is protected by a LinkDemand.

    • Ereditare dai tipi Critical.Inherit from critical types.

    Inoltre, i metodi Transparent non possono eseguire l'override di metodi virtuali Critical o implementare metodi di interfaccia Critical.In addition, transparent methods cannot override critical virtual methods or implement critical interface methods.

  • Il codice SafeCritical è completamente attendibile, ma può essere chiamato dal codice Transparent.Safe-critical code is fully trusted but is callable by transparent code. Espone una superficie di attacco limitata di codice con attendibilità totale; nel codice SafeCritical vengono eseguite verifiche della correttezza e della sicurezza.It exposes a limited surface area of full-trust code; correctness and security verifications happen in safe-critical code.

  • Il codice SecurityCritical può chiamare qualsiasi tipo di codice ed è completamente attendibile, ma non può essere chiamato da codice Transparent.Security-critical code can call any code and is fully trusted, but it cannot be called by transparent code.

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

Esempi di utilizzo e comportamentiUsage Examples and Behaviors

Per specificare le regole di .NET Framework 4.NET Framework 4 (trasparenza di livello 2), usare l'annotazione seguente per un assembly:To specify .NET Framework 4.NET Framework 4 rules (level 2 transparency), use the following annotation for an assembly:

[assembly: SecurityRules(SecurityRuleSet.Level2)]  

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

[assembly: SecurityRules(SecurityRuleSet.Level1)]  

Se non si annota un assembly, per impostazione predefinita vengono usate le regole di .NET Framework 4.NET Framework 4.If you do not annotate an assembly, the .NET Framework 4.NET Framework 4 rules are used by default. Tuttavia, la procedura consigliata consiste nell'utilizzare il SecurityRulesAttribute attributo anziché in base il valore predefinito.However, the recommended best practice is to use the SecurityRulesAttribute attribute instead of depending on the default.

Annotazione a livello di assemblyAssembly-wide Annotation

Le regole seguenti si applicano all'uso degli attributi a livello di assembly.The following rules apply to the use of attributes at the assembly level:

  • Nessun attributo: se non si specificano attributi, il runtime interpreta tutto il codice come SecurityCritical, tranne nei casi in cui tale caratteristica viola una regola di ereditarietà, ad esempio quando si esegue l'override o l'implementazione di un metodo virtuale Transparent o di interfaccia.No attributes: If you do not specify any attributes, the runtime interprets all code as security-critical, except where being security-critical violates an inheritance rule (for example, when overriding or implementing a transparent virtual or interface method). In tali casi, i metodi sono SafeCritical.In those cases, the methods are safe-critical. Se non si specificano attributi, Common Language Runtime determina automaticamente le regole di trasparenza.Specifying no attribute causes the common language runtime to determine the transparency rules for you.

  • SecurityTransparent: tutto il codice è Transparent. L'intero assembly non eseguirà operazioni con privilegi o non sicure.SecurityTransparent: All code is transparent; the entire assembly will not do anything privileged or unsafe.

  • SecurityCritical: tutto il codice introdotto dai tipi di questo assembly è Critical, mentre tutto l'altro codice è Transparent.SecurityCritical: All code that is introduced by types in this assembly is critical; all other code is transparent. Questo scenario è simile al caso in cui non vengono specificati attributi. Tuttavia Common Language Runtime non determina automaticamente le regole di trasparenza.This scenario is similar to not specifying any attributes; however, the common language runtime does not automatically determine the transparency rules. Se si esegue ad esempio l'override di un metodo virtuale o astratto oppure si implementa un metodo di interfaccia, per impostazione predefinita tale metodo è Transparent.For example, if you override a virtual or abstract method or implement an interface method, by default, that method is transparent. È necessario annotare in modo esplicito il metodo come SecurityCritical o SecuritySafeCritical; in caso contrario, verrà generata un'eccezione TypeLoadException durante il caricamento.You must explicitly annotate the method as SecurityCritical or SecuritySafeCritical; otherwise, a TypeLoadException will be thrown at load time. Questa regola si applica anche quando la classe base e la classe derivata si trovano nello stesso assembly.This rule also applies when both the base class and the derived class are in the same assembly.

  • AllowPartiallyTrustedCallers (solo livello 2): tutto il codice è Transparent per impostazione predefinita. I singoli tipi e membri possono tuttavia avere altri attributi.AllowPartiallyTrustedCallers (level 2 only): All code defaults to transparent. I singoli tipi e membri possono tuttavia avere altri attributi.However, individual types and members can have other attributes.

Nella tabella seguente viene confrontato il comportamento di livello di assembly di livello 2 con livello 1.The following table compares the assembly level behavior for Level 2 with Level 1.

Assembly (attributo)Assembly attribute Livello 2Level 2 Livello 1Level 1
Nessun attributo su un assembly parzialmente attendibileNo attribute on a partially trusted assembly I tipi e i membri sono Transparent per impostazione predefinita, ma possono essere SecurityCritical o SecuritySafeCritical.Types and members are by default transparent, but can be security-critical or security-safe-critical. Tutti i tipi e i membri sono Transparent.All types and members are transparent.
Nessun attributoNo attribute Se non si specificano attributi, Common Language Runtime determina automaticamente le regole di trasparenza.Specifying no attribute causes the common language runtime to determine the transparency rules for you. Tutti i tipi e i membri sono SecurityCritical, tranne nei casi in cui tale caratteristica viola una regola di ereditarietà.All types and members are security-critical, except where being security-critical violates an inheritance rule. In un assembly completamente attendibile (nella Global Assembly Cache o identificato come con attendibilità totale in AppDomain) tutti i tipi sono Transparent e tutti i membri sono SecuritySafeCritical.On a fully trusted assembly (in the global assembly cache or identified as full trust in the AppDomain) 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. Tutti i tipi e i membri sono Transparent.All types and members are transparent.
SecurityCritical(SecurityCriticalScope.Everything) Non applicabile.Not applicable. Tutti i tipi e i membri sono SecurityCritical.All types and members are security-critical.
SecurityCritical Tutto il codice introdotto dai tipi di questo assembly è Critical, mentre tutto l'altro codice è Transparent.All code that is introduced by types in this assembly is critical; all other code is transparent. Se si esegue l'override di un metodo virtuale o astratto oppure si implementa un metodo di interfaccia, è necessario annotare in modo esplicito il metodo come SecurityCritical o SecuritySafeCritical.If you override a virtual or abstract method or implement an interface method, you must explicitly annotate the method as SecurityCritical or SecuritySafeCritical. 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.

Annotazione dei tipi e dei membriType and Member Annotation

Gli attributi di sicurezza applicati a un tipo si applicano anche ai membri introdotti dal tipo.The security attributes that are applied to a type also apply to the members that are introduced by the type. Non si applicano tuttavia a override virtuali o astratti della classe base o delle implementazioni dell'interfaccia.However, they do not apply to virtual or abstract overrides of the base class or interface implementations. Le regole seguenti si applicano all'uso degli attributi a livello di tipo e membro:The following rules apply to the use of attributes at the type and member level:

  • SecurityCritical: il tipo o il membro è Critical e può essere chiamato solo da codice con attendibilità totale.SecurityCritical: The type or member is critical and can be called only by full-trust code. I metodi introdotti in un tipo SecurityCritical sono Critical.Methods that are introduced in a security-critical type are critical.

    Importante

    I metodi virtuali e astratti introdotti in classi base o interfacce e sottoposti a override o implementati in una classe SecurityCritical sono Transparent per impostazione predefinita.Virtual and abstract methods that are introduced in base classes or interfaces, and overridden or implemented in a security-critical class are transparent by default. Devono essere identificati come SecuritySafeCritical o SecurityCritical.They must be identified as either SecuritySafeCritical or SecurityCritical.

  • SecuritySafeCritical: il tipo o il membro è SafeCritical.SecuritySafeCritical: The type or member is safe-critical. Il tipo o il membro può tuttavia essere chiamato da codice Transparent (parzialmente attendibile) e funziona come qualsiasi altro codice Critical.However, the type or member can be called from transparent (partially trusted) code and is as capable as any other critical code. Il codice deve essere controllato per garantirne la sicurezza.The code must be audited for security.

Torna all'inizioBack to top

Criteri di overrideOverride Patterns

Nella tabella seguente vengono elencati gli override dei metodi consentiti per la trasparenza di livello 2.The following table shows the method overrides allowed for level 2 transparency.

Membro di base virtuale/di interfacciaBase virtual/interface member Override/interfacciaOverride/interface
Transparent Transparent
Transparent SafeCritical
SafeCritical Transparent
SafeCritical SafeCritical
Critical Critical

Torna all'inizioBack to top

Regole di ereditarietàInheritance Rules

In questa sezione, l'ordine seguente è assegnato al codice Transparent, Critical e SafeCritical in base all'accesso e alle funzionalità: In this section, the following order is assigned to Transparent, Critical, and SafeCritical code based on access and capabilities:

Transparent < SafeCritical < Critical

  • Regole per i tipi: da sinistra verso destra l'accesso diventa più restrittivo.Rules for types: Going from left to right, access becomes more restrictive. I tipi derivati devono essere restrittivi almeno quanto il tipo di base.Derived types must be at least as restrictive as the base type.

  • Regole per i metodi: i metodi derivati non possono modificare l'accessibilità dal metodo di base.Rules for methods: Derived methods cannot change accessibility from the base method. Per il comportamento predefinito, tutti i metodi derivati non annotati sono Transparent.For default behavior, all derived methods that are not annotated are Transparent. I derivati di tipi Critical provocano un'eccezione se il metodo sottoposto a override non è annotato in modo esplicito come SecurityCritical.Derivatives of critical types cause an exception to be thrown if the overridden method is not explicitly annotated as SecurityCritical.

Nella tabella seguente vengono elencati i criteri dell'ereditarietà dei tipi consentiti.The following table shows the allowed type inheritance patterns.

Classe baseBase class La classe derivata può essereDerived class can be
Transparent Transparent
Transparent SafeCritical
Transparent Critical
SafeCritical SafeCritical
SafeCritical Critical
Critical Critical

Nella tabella seguente vengono elencati i criteri di ereditarietà dei tipi non consentiti.The following table shows the disallowed type inheritance patterns.

Classe baseBase class La classe derivata non può essereDerived class cannot be
SafeCritical Transparent
Critical Transparent
Critical SafeCritical

Nella tabella seguente vengono elencati i criteri di ereditarietà dei metodi consentiti.The following table shows the allowed method inheritance patterns.

Metodo di baseBase method Il metodo derivato può essereDerived method can be
Transparent Transparent
Transparent SafeCritical
SafeCritical Transparent
SafeCritical SafeCritical
Critical Critical

Nella tabella seguente vengono elencati i criteri di ereditarietà dei metodi non consentiti.The following table shows the disallowed method inheritance patterns.

Metodo di baseBase method Il metodo derivato non può essereDerived method cannot be
Transparent Critical
SafeCritical Critical
Critical Transparent
Critical SafeCritical

Nota

Queste regole di ereditarietà si applicano a tipi e membri di livello 2.These inheritance rules apply to level 2 types and members. I tipi di assembly di livello 1 possono ereditare dai membri e dai tipi SecurityCritical di livello 2.Types in level 1 assemblies can inherit from level 2 security-critical types and members. Pertanto, i tipi e i membri di livello 2 devono disporre di richieste di ereditarietà separate per gli eredi di livello 1.Therefore, level 2 types and members must have separate inheritance demands for level 1 inheritors.

Torna all'inizioBack to top

Informazioni e regole aggiuntiveAdditional Information and Rules

Supporto LinkDemandLinkDemand Support

Nel modello di trasparenza di livello 2, LinkDemand è stato sostituito dall'attributo SecurityCriticalAttribute.The level 2 transparency model replaces the LinkDemand with the SecurityCriticalAttribute attribute. Nel codice legacy (livello 1), LinkDemand viene trattato automaticamente come Demand.In legacy (level 1) code, a LinkDemand is automatically treated as a Demand.

ReflectionReflection

Se si richiama un metodo Critical o si legge un campo Critical, viene generata una richiesta di attendibilità totale, come se si stesse richiamando un metodo o un campo Private.Invoking a critical method or reading a critical field triggers a demand for full trust (just as if you were invoking a private method or field). Il codice con attendibilità totale può quindi richiamare un metodo Critical, a differenza del codice parzialmente attendibile.Therefore, full-trust code can invoke a critical method, whereas partial-trust code cannot.

Le proprietà seguenti sono state aggiunte allo spazio dei nomi di System.Reflection per determinare se il tipo, il metodo, o il campo è SecurityCritical, SecuritySafeCritical o SecurityTransparent: IsSecurityCritical, IsSecuritySafeCritical e IsSecurityTransparent.The following properties have been added to the System.Reflection namespace to determine whether the type, method, or field is SecurityCritical, SecuritySafeCritical, or SecurityTransparent: IsSecurityCritical, IsSecuritySafeCritical, and IsSecurityTransparent. Usare queste proprietà per determinare la trasparenza con reflection anziché verificare la presenza dell'attributo.Use these properties to determine transparency by using reflection instead of checking for the presence of the attribute. Le regole di trasparenza sono complesse ed la verifica dell'attributo potrebbe non essere sufficiente.The transparency rules are complex, and checking for the attribute may not be sufficient.

Nota

Oggetto SafeCritical restituisce true per entrambi IsSecurityCritical e IsSecuritySafeCriticalperché SafeCritical è critical (ha le stesse funzionalità di codice critico, ma può essere chiamato da codice transparent).A SafeCritical method returns true for both IsSecurityCritical and IsSecuritySafeCritical, because SafeCritical is indeed critical (it has the same capabilities as critical code, but it can be called from transparent code).

I metodi dinamici ereditano la trasparenza dei moduli a cui sono allegati, mentre non ereditano la trasparenza del tipo, nel caso in cui siano allegati a un tipo.Dynamic methods inherit the transparency of the modules they are attached to; they do not inherit the transparency of the type (if they are attached to a type).

Ignorare la verifica in attendibilità totaleSkip Verification in Full Trust

È possibile ignorare la verifica degli assembly Transparent completamente attendibili impostando la proprietà SkipVerificationInFullTrust su true nell'attributo SecurityRulesAttribute:You can skip verification for fully trusted transparent assemblies by setting the SkipVerificationInFullTrust property to true in the SecurityRulesAttribute attribute:

[assembly: SecurityRules(SecurityRuleSet.Level2, SkipVerificationInFullTrust = true)]

La proprietà SkipVerificationInFullTrust è falsee per impostazione predefinita, quindi deve essere impostata su true per ignorare la verifica.The SkipVerificationInFullTrust property is false by default, so the property must be set to true to skip verification. Questa operazione deve essere eseguita solo per ottimizzare le prestazioni.This should be done for optimization purposes only. È necessario assicurarsi che il codice transparent dell'assembly sia verificabile con il transparent opzione il strumento PEVerify.You should ensure that the transparent code in the assembly is verifiable by using the transparent option in the PEVerify tool.

Vedere ancheSee Also

Il codice SecurityTransparent, livello 1Security-Transparent Code, Level 1
Modifiche della sicurezzaSecurity Changes