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

In diesem Thema werden empfohlene Vorgehensweisen für die Ausführung von Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) in einer teilweise vertrauenswürdigen Umgebung beschrieben.This topic describes best practices when running Windows Communication Foundation (WCF)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 teilweise vertrauenswürdige WCFWCF-Sicherheitsmodell geht davon aus, dass jeder Aufrufer einer öffentlichen WCFWCF-Methode oder -Eigenschaft im Codezugriffssicherheits-Kontext (Code Access Security, CAS) der Hostanwendung ausgeführt wird.The WCFWCF partial trust security model assumes that any caller of a WCFWCF public method or property is running in the code access security (CAS) context of the hosting application. WCFWCF geht weiter davon aus, dass nur ein Anwendungssicherheitskontext für jede AppDomain vorhanden ist und dass dieser Kontext zum Zeitpunkt der AppDomain-Erstellung durch einen vertrauenswürdigen Host eingerichtet wird (beispielsweise durch einen Aufruf von CreateDomain oder des ASP.NET-Anwendungs-Managers). 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. Bei vollständig vertrauenswürdigem Plattformcode (beispielsweise eine von Dritten erstellte Assembly, die im globalen Assemblycache installiert wird und Aufrufe von teilweise vertrauenswürdigem Code akzeptiert) ist jedoch eine vorsichtige Vorgehensweise erforderlich, wenn WCFWCF im Auftrag einer teilweise vertrauenswürdigen Anwendung aufgerufen wird, um das Entstehen von Sicherheitsrisiken auf Anwendungsebene zu vermeiden.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 WCFWCF on behalf of a partially-trusted application to avoid introducing application-level security vulnerabilities.

Vollständig vertrauenswürdiger Code sollte es vermeiden, den CAS-Berechtigungsatz des aktuellen Threads zu verändern (durch Aufrufen von Assert, PermitOnly oder Deny), bevor er WCFWCF-APIs für teilweise vertrauenswürdigen Code aufruft.Full-trust code should avoid altering the CAS permission set of the current thread (by calling Assert, PermitOnly, or Deny) prior to calling WCFWCF 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 WCFWCF mithilfe eines threadspezifischen Berechtigungskontexts aufruft, muss auf die Bewältigung der folgenden, möglicherweise eintretenden Situationen vorbereitet werden:Code that calls into WCFWCF 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.

  • Interner WCFWCF-Code sowie vom Benutzer bereitgestellte Rückrufe können in einem anderen Sicherheitskontext ausgeführt werden als dem, in dem der Aufruf ursprünglich initiiert wurde.Internal WCFWCF 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.

    • Threadspezifischer Berechtigungskontext, der zuvor von anderen Benutzerthreads verwendet wurde, um WCFWCF während der Lebensdauer der aktuell ausführenden AppDomain aufzurufenAny thread-specific permission context previously created by other user threads used to call into WCFWCF during the lifetime of the currently running AppDomain.

WCFWCF stellt sicher, dass teilweise vertrauenswürdiger Code voll vertrauenswürdige Berechtigungen nur dann erhalten kann, wenn die Berechtigungen vor dem Aufrufen der öffentlichen WCFWCF-APIs von einer voll vertrauenswürdigen Komponente gewährt werden. guarantees that partially-trusted code cannot obtain full-trust permissions unless such permissions are asserted by a fully-trusted component prior to calling into WCFWCF 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