Procedure consigliate in ambienti parzialmente attendibiliPartial Trust Best Practices

In questo argomento descrive le procedure consigliate durante l'esecuzione di Windows Communication Foundation (WCF) in un ambiente parzialmente attendibile.This topic describes best practices when running Windows Communication Foundation (WCF) in a partial trust environment.

SerializzazioneSerialization

Applicare le procedure seguenti quando si utilizza DataContractSerializer in un'applicazione parzialmente attendibile.Apply the following practices when using the DataContractSerializer in a partially-trusted application.

  • Tutti i tipi serializzabili devono essere contrassegnati in modo esplicito con l'attributo [DataContract].All serializable types must be explicitly marked with the [DataContract] attribute. Le tecniche seguenti non sono supportate in un ambiente parzialmente attendibile:The following techniques are not supported in a partial trust environment:

  • Contrassegno delle classi da serializzare con SerializableAttribute.Marking classes to be serialized with the SerializableAttribute.

  • Implementazione dell'interfaccia ISerializable per consentire a una classe di controllare il suo processo di serializzazione.Implementing the ISerializable interface to allow a class to control its serialization process.

Utilizzo di DataContractSerializerUsing DataContractSerializer

  • Tutti i tipi contrassegnati con l'attributo [DataContract] devono essere pubblici.All types marked with the [DataContract] attribute must be public. Impossibile serializzare tipi non pubblici in un ambiente parzialmente attendibile.Non-public types cannot be serialized in a partial trust environment.

  • I membri [DataContract] in un tipo [DataContract] serializzabile devono essere pubblici.All [DataContract] members in a serializable [DataContract] type must be public. Un tipo con un [DataMember] non pubblico non può essere serializzato in un ambiente parzialmente attendibile.A type with a non-public [DataMember] cannot be serialized in a partial trust environment.

  • I metodi che gestiscono eventi di serializzazione (ad esempio OnSerializing, OnSerialized, OnDeserializing e OnDeserialized) devono essere dichiarati pubblici.Methods that handle serialization events (such as OnSerializing, OnSerialized, OnDeserializing, and OnDeserialized) must be declared as public. Sono tuttavia supportate le implementazioni sia esplicite che implicite di OnDeserialization(Object).However, both explicit and implicit implementations of OnDeserialization(Object) are supported.

  • I tipi [DataContract] implementati in assembly contrassegnati con AllowPartiallyTrustedCallersAttribute non devono eseguire azioni correlate alla protezione nel costruttore del tipo, poiché DataContractSerializer non chiama il costruttore dell'oggetto di cui è appena stata creata un'istanza durante la deserializzazione.[DataContract] types implemented in assemblies marked with the AllowPartiallyTrustedCallersAttribute must not perform security-related actions in the type constructor, as the DataContractSerializer does not call the constructor of the newly-instantiated object during deserialization. In particolare, è necessario evitare le tecniche di sicurezza comuni seguenti per i tipi [DataContract]:Specifically, the following common security techniques must be avoided for [DataContract] types:

  • Tentare di limitare l'accesso parzialmente attendibile rendendo interno o privato il costruttore del tipo.Attempting to restrict partial trust access by making the type's constructor internal or private.

  • Limitare l'accesso al tipo aggiungendo un [LinkDemand] al costruttore del tipo.Restricting access to the type by adding a [LinkDemand] to the type's constructor.

  • Dare per scontato che, dato che l'istanza dell'oggetto è stata creata correttamente, qualsiasi controllo di convalida applicato dal costruttore abbia avuto esito positivo.Assuming that because the object has been successfully instantiated, any validation checks enforced by the constructor have passed successfully.

Utilizzo di IXmlSerializableUsing IXmlSerializable

Le procedure consigliate seguenti si applicano ai tipi che implementano IXmlSerializable e che vengono serializzati tramite DataContractSerializer:The following best practices apply for types that implement IXmlSerializable and are serialized using the DataContractSerializer:

  • Le implementazioni del metodo statico GetSchema devono essere public.The GetSchema static method implementations must be public.

  • I metodi di istanza che implementano l'interfaccia IXmlSerializable devono essere public.The instance methods that implement the IXmlSerializable interface must be public.

Utilizzo di WCF da codice della piattaforma completamente attendibile che consente chiamate da chiamanti parzialmente attendibiliUsing WCF from Fully-Trusted Platform Code that Allows Calls from Partially Trusted Callers

Il modello di sicurezza parzialmente attendibile WCF si presuppone che qualsiasi chiamante di un metodo pubblico di WCF o una proprietà sia in esecuzione nel contesto di sicurezza dall'accesso del codice dell'applicazione host.The WCF partial trust security model assumes that any caller of a WCF public method or property is running in the code access security (CAS) context of the hosting application. WCF si presuppone inoltre tale contesto di sicurezza di un'unica applicazione disponibile per ogni AppDomain, e che questo contesto sia stabilito al AppDomain ora di creazione da un host attendibile (ad esempio, da una chiamata a CreateDomain o da Gestione applicazioni ASP.NET).WCF also assumes that only one application security context exists for each AppDomain, and that this context is established at AppDomain creation time by a trusted host (for example, by a call to CreateDomain or by the ASP.NET Application Manager).

Questo modello di sicurezza si applica alle applicazioni scritte dall'utente che non possono richiedere autorizzazioni CAS aggiuntive, ad esempio codice utente in esecuzione in un'applicazione ASP.NET con un livello di attendibilità medio.This security model applies to user-written applications that cannot assert additional CAS permissions, such as user code running in a Medium Trust ASP.NET application. Tuttavia, il codice di piattaforma completamente attendibile (ad esempio, un assembly di terze parti che viene installato nella global assembly cache e accetta le chiamate da codice parzialmente attendibile) occorre fare esplicitamente attenzione quando si chiama su WCF per conto di un'applicazione parzialmente attendibile evitare di introdurre vulnerabilità della sicurezza a livello di applicazione.However, fully-trusted platform code (for example, a third-party assembly that is installed in the global assembly cache and accepts calls from partially-trusted code) must take explicit care when calling into WCF on behalf of a partially-trusted application to avoid introducing application-level security vulnerabilities.

Codice di attendibilità totale deve evitare di modificare l'autorizzazione CAS impostata del thread corrente (chiamando Assert, PermitOnly, o Deny) prima di chiamare le API WCF per conto di codice parzialmente attendibile.Full-trust code should avoid altering the CAS permission set of the current thread (by calling Assert, PermitOnly, or Deny) prior to calling WCF APIs on behalf of partially-trusted code. L'asserzione, la negazione o la creazione di un contesto di autorizzazione specifico del thread che è indipendente dal contesto di sicurezza a livello di applicazione possono dare luogo a un comportamento imprevisto.Asserting, denying, or otherwise creating a thread-specific permission context that is independent of the application-level security context can result in unexpected behavior. A seconda dell'applicazione, questo comportamento può comportare vulnerabilità di sicurezza a livello di applicazione.Depending on the application, this behavior may result in application-level security vulnerabilities.

Codice che chiama in WCF usando un contesto di autorizzazione specifico del thread deve essere preparato a gestire le situazioni seguenti che possono verificarsi:Code that calls into WCF using a thread-specific permission context must be prepared to handle the following situations that may arise:

  • Il contesto di sicurezza specifico del thread potrebbe non essere mantenuto per la durata dell'operazione, il che comporta potenziali eccezioni di sicurezza.The thread-specific security context may not be maintained for the duration of the operation, which results in potential security exceptions.

  • Codice WCF interno, così come qualsiasi callback fornito dall'utente possono essere eseguite in un contesto di sicurezza diverso da quello in cui è iniziata originariamente la chiamata.Internal WCF code as well as any user-provided callbacks may run in a different security context than the one under which the call was originally initiated. Questi contesti includono:These contexts include:

    • Il contesto di autorizzazione dell'applicazione.The application permission context.

    • Qualsiasi contesto di autorizzazione specifico del thread creato in precedenza da altri thread dell'utente utilizzato per effettuare chiamate nel WCF tutta la durata dell'esecuzione AppDomain.Any thread-specific permission context previously created by other user threads used to call into WCF during the lifetime of the currently running AppDomain.

WCF garantisce che codice parzialmente attendibile non è possibile ottenere le autorizzazioni di attendibilità, a meno che tali autorizzazioni vengano asserite da un componente completamente attendibile prima di chiamare nelle API pubbliche di WCF.WCF guarantees that partially-trusted code cannot obtain full-trust permissions unless such permissions are asserted by a fully-trusted component prior to calling into WCF public APIs. Non garantisce, tuttavia, che gli effetti dell'asserzione di attendibilità totale siano isolati in un thread, operazione o azione dell'utente specifico.However, it does not guarantee that the effects of asserting full trust is isolated to a particular thread, operation, or user action.

Come procedura consigliata, evitare di creare un contesto di autorizzazione specifico del thread chiamando Assert, PermitOnly o Deny.As a best practice, avoid creating thread-specific permission context by calling Assert, PermitOnly, or Deny. In alternativa, concedere o negare il privilegio all'applicazione stessa, così che non sia necessario Assert, Deny o PermitOnly.Instead, grant or deny the privilege to the application itself, so that no Assert, Deny, or PermitOnly is required.

Vedere ancheSee Also

DataContractSerializer
IXmlSerializable