Empfehlungen für eine teilweise vertrauenswürdige UmgebungPartial Trust Best Practices

Dieses Thema beschreibt bewährte Methoden bei der Ausführung von Windows Communication Foundation (WCF) in einer teilweise vertrauenswürdigen Umgebung.This topic describes best practices when running Windows Communication Foundation (WCF) in a partial trust environment.

SerialisierungSerialization

Gehen Sie wie nachfolgend beschrieben vor, wenn Sie den DataContractSerializer in einer teilweise vertrauenswürdigen Anwendung verwenden.Apply the following practices when using the DataContractSerializer in a partially-trusted application.

  • Alle serialisierbaren Typen müssen explizit mit dem [DataContract]-Attribut gekennzeichnet werden.All serializable types must be explicitly marked with the [DataContract] attribute. Die folgenden Techniken werden in einer teilweise vertrauenswürdigen Umgebung nicht unterstützt:The following techniques are not supported in a partial trust environment:

  • Das Markieren von Klassen, die serialisiert werden sollen, mit SerializableAttributeMarking classes to be serialized with the SerializableAttribute.

  • Das Implementieren der ISerializable-Schnittstelle, damit eine Klasse ihren Serialisierungsprozess steuern kannImplementing the ISerializable interface to allow a class to control its serialization process.

Verwenden von DataContractSerializerUsing DataContractSerializer

  • Alle mit dem [DataContract]-Attribut gekennzeichneten Typen müssen öffentlich sein.All types marked with the [DataContract] attribute must be public. Nicht öffentliche Typen können in einer teilweise vertrauenswürdigen Umgebung nicht serialisiert werden.Non-public types cannot be serialized in a partial trust environment.

  • Alle [DataContract]-Member in einem serialisierbaren [DataContract]-Typ müssen öffentlich sein.All [DataContract] members in a serializable [DataContract] type must be public. Ein Typ mit einem nicht öffentlichen [DataMember] kann in einer teilweise vertrauenswürdigen Umgebung nicht serialisiert werden.A type with a non-public [DataMember] cannot be serialized in a partial trust environment.

  • Methoden, die Serialisierungsereignisse verarbeiten (z. B. OnSerializing, OnSerialized, OnDeserializing und OnDeserialized), müssen als öffentlich deklariert werden.Methods that handle serialization events (such as OnSerializing, OnSerialized, OnDeserializing, and OnDeserialized) must be declared as public. Jedoch werden sowohl explizite als auch implizite Implementierungen von OnDeserialization(Object) unterstützt.However, both explicit and implicit implementations of OnDeserialization(Object) are supported.

  • [DataContract]-Typen, die in Assemblys implementiert und mit AllowPartiallyTrustedCallersAttribute gekennzeichnet sind, dürfen keine sicherheitsbezogenen Aktionen im Typenkonstruktor ausführen, da der DataContractSerializer den Konstruktor des neu instanziierten Objekts während der Deserialisierung aufruft.[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. Die folgenden allgemeinen Sicherheitstechniken müssen für [DataContract]-Typen vermieden werden:Specifically, the following common security techniques must be avoided for [DataContract] types:

  • Der Versuch, den teilweise vertrauenswürdigen Zugriff durch Definieren des Konstruktors für den Typ als intern oder privat zu beschränkenAttempting to restrict partial trust access by making the type's constructor internal or private.

  • Einschränken des Zugriffs auf den Typ durch Hinzufügen von [LinkDemand] zum Konstruktor des TypsRestricting access to the type by adding a [LinkDemand] to the type's constructor.

  • Da das Objekt erfolgreich instanziiert wurde, wird davon ausgegangen, dass eventuelle vom Konstruktor erzwungene Validierungsüberprüfungen erfolgreich bestanden wurden.Assuming that because the object has been successfully instantiated, any validation checks enforced by the constructor have passed successfully.

Verwenden von IXmlSerializableUsing IXmlSerializable

Die folgenden empfohlenen Vorgehensweisen gelten für Typen, die IXmlSerializable implementieren und mit DataContractSerializer serialisiert werden:The following best practices apply for types that implement IXmlSerializable and are serialized using the DataContractSerializer:

  • Die statischen GetSchema-Methodenimplementierungen müssen public sein.The GetSchema static method implementations must be public.

  • Die Instanzmethoden, die die IXmlSerializable-Schnittstelle implementieren, müssen public sein.The instance methods that implement the IXmlSerializable interface must be public.

Verwenden von WCF aus vollständig vertrauenswürdigem Plattformcode, der Aufrufe teilweise vertrauenswürdiger Aufrufer zulässtUsing WCF from Fully-Trusted Platform Code that Allows Calls from Partially Trusted Callers

Das Sicherheitsmodell der WCF-teilweiser Vertrauenswürdigkeit wird davon ausgegangen, dass jeder Aufrufer einer öffentlichen WCF-Methode oder Eigenschaft im Code den Zugriff (CAS) Sicherheitskontext der hostanwendung ausgeführt wird.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 auch geht davon aus, nur ein anwendungssicherheitskontext vorhanden ist, für die einzelnen AppDomain, und die diesem Kontext wird an AppDomain Zeitpunkt der Erstellung von einem vertrauenswürdigen Host (z. B. durch einen Aufruf von CreateDomain oder durch des ASP.NET-Anwendungs-Managers).).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).

Dieses Sicherheitsmodell gilt für Anwendungen, die vom Benutzer verfasst wurden und keine zusätzlichen CAS-Berechtigungen gewähren können, wie z. B. Benutzercode, der in einer ASP.NET-Anwendung mittlerer Vertrauenswürdigkeit ausgeführt wird.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. Vollständig vertrauenswürdigem Plattformcode (z. B. eine Drittanbieter-Assembly, die im globalen Assemblycache installiert ist und die Aufrufe von teilweise vertrauenswürdigem Code akzeptiert) muss jedoch explizite Sorgfalt vorgehen, wenn WCF im Auftrag einer teilweise vertrauenswürdigen Anwendung aufgerufen Vermeiden Sie die Einführung von Sicherheitsrisiken auf Anwendungsebene.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.

Ändern des CAS-Berechtigungssatzes des aktuellen Threads ist voll vertrauenswürdigem Code vermeiden (durch Aufrufen von Assert, PermitOnly, oder Deny) vor dem Aufrufen von WCF-APIs im Namen von teilweise vertrauenswürdigem Code.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. Das Gewähren, Abweisen oder anderweitige Erstellen von threadspezifischem Berechtigungskontext, der unabhängig vom Sicherheitskontext der Anwendungsebene ist, kann zu unerwartetem Verhalten führen.Asserting, denying, or otherwise creating a thread-specific permission context that is independent of the application-level security context can result in unexpected behavior. Je nach Anwendung kann dieses Verhalten zu Sicherheitslücken auf Anwendungsebene führen.Depending on the application, this behavior may result in application-level security vulnerabilities.

Code, der Aufrufe in WCF mit einem threadspezifischer Berechtigungskontext, der darauf vorbereitet sein müssen, um den folgenden Situationen zu behandeln, die auftreten können:Code that calls into WCF using a thread-specific permission context must be prepared to handle the following situations that may arise:

  • Der threadspezifische Sicherheitskontext kann möglicherweise nicht für die Dauer des Vorgangs aufrechterhalten werden, was zu potenziellen Sicherheitsausnahmen führt.The thread-specific security context may not be maintained for the duration of the operation, which results in potential security exceptions.

  • Interne WCF-Code als auch für alle Benutzer bereitgestellte Rückrufe können in einem anderen Sicherheitskontext als dem, führen Sie unter denen der Aufruf ursprünglich initiiert wurde.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. Zu diesen Kontexten gehören:These contexts include:

    • Der Berechtigungskontext der AnwendungThe application permission context.

    • Alle threadspezifischer Berechtigungskontext, der zuvor erstellt haben, von anderen Benutzerthreads verwendet, um in WCF während der Lebensdauer der aktuell ausführenden aufzurufen 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 wird sichergestellt, dass teilweise vertrauenswürdiger Code voll vertrauenswürdige Berechtigungen erhalten kann, es sei denn, diese Berechtigungen von einer voll vertrauenswürdigen Komponente vor dem Aufrufen der öffentlichen WCF-APIs übergeben werden.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. Jedoch besteht dabei nicht die Garantie, dass die Gewährung voller Vertrauenswürdigkeit auf einen bestimmten Thread, Vorgang oder eine bestimmte Benutzeraktion beschränkt ist.However, it does not guarantee that the effects of asserting full trust is isolated to a particular thread, operation, or user action.

Es empfiehlt sich daher, die Erstellung von threadspezifischem Berechtigungskontext durch Aufrufen von Assert, PermitOnly oder Deny zu vermeiden.As a best practice, avoid creating thread-specific permission context by calling Assert, PermitOnly, or Deny. Gewähren oder verweigern Sie stattdessen der Anwendung selbst die Berechtigung, damit Assert, Deny oder PermitOnly nicht erforderlich ist.Instead, grant or deny the privilege to the application itself, so that no Assert, Deny, or PermitOnly is required.

Siehe auchSee Also

DataContractSerializer
IXmlSerializable