Grundlagen der SchutzebeneUnderstanding Protection Level

Die ProtectionLevel-Eigenschaft ist in vielen anderen Klassen zu finden, z. B. die ServiceContractAttribute-Klasse und die OperationContractAttribute-Klasse.The ProtectionLevel property is found on many different classes, such as the ServiceContractAttribute and the OperationContractAttribute classes. Die Eigenschaft steuert, wie eine Nachricht zum Teil (oder ganz) geschützt wird.The property controls how a part (or whole) of a message is protected. In diesem Thema wird erläutert, die Windows Communication Foundation (WCF)-Funktion und wie diese funktioniert.This topic explains the Windows Communication Foundation (WCF) feature and how it works.

Anweisungen zum Festlegen der Schutzebene, finden Sie unter Vorgehensweise: Festlegen der ProtectionLevel-Eigenschaft.For instructions on setting the protection level, see How to: Set the ProtectionLevel Property.

Hinweis

Schutzebenen können nur im Code, nicht in der Konfiguration festgelegt werden.Protection levels can be set only in code, not in configuration.

GrundlagenBasics

Um die Schutzebenenfunktion zu verstehen, sind die folgenden grundlegenden Anweisungen wichtig:To understand the protection level feature, the following basic statements apply:

  • Drei grundlegende Ebenen des Schutzes sind für jeden Teil einer Nachricht vorhanden.Three basic levels of protection exist for any part of a message. Die Eigenschaft wird (bei jedem Auftreten) auf einen der ProtectionLevel-Enumerationswerte festgelegt.The property (wherever it occurs) is set to one of the ProtectionLevel enumeration values. In aufsteigender Reihenfolge des Schutzes umfassen sie:In ascending order of protection, they include:

    • NoneNone.

    • SignSign. Der geschützte Teil wird digital signiert.The protected part is digitally signed. Dies stellt sicher, dass eine Manipulation am Nachrichtenteil erkannt wird.This ensures detection of any tampering with the protected message part.

    • EncryptAndSignEncryptAndSign. Der Nachrichtenteil wird verschlüsselt, um Vertraulichkeit sicherzustellen, bevor er signiert wird.The message part is encrypted to ensure confidentiality before it is signed.

  • Sie können schutzanforderungen nur für festlegen Anwendungsdaten mit dieser Funktion.You can set protection requirements only for application data with this feature. WS-Adressierungsheader sind z. B. Infrastrukturdaten und werden deshalb nicht vom ProtectionLevel beeinflusst.For example, WS-Addressing headers are infrastructure data and, therefore, are not affected by the ProtectionLevel.

  • Wenn der Sicherheitsmodus auf Transport festgelegt wird, wird die ganze Nachricht vom Transportmechanismus geschützt.When the security mode is set to Transport, the entire message is protected by the transport mechanism. Deshalb hat das Festlegen einer separaten Schutzebene für andere Teile einer Nachricht keine Auswirkungen.Therefore, setting a separate protection level for different parts of a message has no effect.

  • Die ProtectionLevel ist eine Möglichkeit für Entwickler zum Festlegen der Mindestebene , die eine Bindung aufweisen muss.The ProtectionLevel is a way for the developer to set the minimum level that a binding must comply with. Beim Bereitstellen eines Diensts kann die tatsächliche in der Konfiguration angegebene Bindung die Mindestebene unterstützen oder nicht.When a service is deployed, the actual binding specified in configuration may or may not support the minimum level. Standardmäßig stellt die BasicHttpBinding-Klasse keine Sicherheit bereit (diese kann allerdings aktiviert werden).For example, by default, the BasicHttpBinding class does not supply security (although it can be enabled). Die Verwendung dieser Klasse in Verbindung mit einem Vertrag, der eine andere Einstellung als None hat, löst eine Ausnahme aus.Therefore, using it with a contract that has any setting other than None will cause an exception to be thrown.

  • Wenn der Dienst erfordert, dass die minimale ProtectionLevel wird für alle Nachrichten Sign, ein Client (z. B. durch eine nicht-WCF-Technologie erstellt) kann verschlüsseln und signieren Sie alle Nachrichten (Dies ist mehr als das Minimum erforderlich).If the service requires that the minimum ProtectionLevel for all messages is Sign, a client (perhaps created by a non-WCF technology) can encrypt and sign all messages (which is more than the minimum required). In diesem Fall wird WCF keine Ausnahme auslöst, weil der Client mehr als das Minimum durchgeführt hat.In this case, WCF will not throw an exception because the client has done more than the minimum. Beachten Sie jedoch, dass WCF-Anwendungen (Dienste oder Clients) nicht übermäßig einen Nachrichtenteil Wenn möglich schützen, aber die Mindestebene einhalten.Note, however, that WCF applications (services or clients) will not over-secure a message part if possible but will comply with the minimum level. Außerdem ist zu beachten, dass der Transport den Nachrichtenstrom bei Verwendung von Transport als Sicherheitsmodus übermäßig schützt, da in diesem Fall ein Schutz auf niedrigerer Ebene nicht möglich ist.Also note that when using Transport as the security mode, the transport may over-secure the message stream because it is inherently unable to secure at a more granular level.

  • Wenn Sie ProtectionLevel ausdrücklich entweder auf Sign oder EncryptAndSign festlegen, müssen Sie eine Bindung mit aktivierter Sicherheit verwenden. Andernfalls wird eine Ausnahme ausgelöst.If you set the ProtectionLevel explicitly to either Sign or EncryptAndSign, then you must use a binding with security enabled or an exception will be thrown.

  • Wählen Sie eine Bindung aus, die Sicherheit aktiviert, und legen Sie im Vertrag keine ProtectionLevel-Eigenschaft fest, werden alle Daten verschlüsselt und signiert.If you select a binding that enables security and you do not set the ProtectionLevel property anywhere on the contract, all application data will be encrypted and signed.

  • Wählen Sie eine Bindung aus, für die keine Sicherheit aktiviert wurde (für die BasicHttpBinding-Klasse ist die Sicherheit beispielsweise standardmäßig deaktiviert) und für die ProtectionLevel nicht ausdrücklich festgelegt ist, werden keine Anwendungsdaten geschützt.If you select a binding that does not have security enabled (for example, the BasicHttpBinding class has security disabled by default), and the ProtectionLevel is not explicitly set, then none of the application data will be protected.

  • Bei Verwendung einer Bindung, die Sicherheit auf der Transportebene anwendet, werden alle Anwendungsdaten den Transportfunktionen entsprechend geschützt.If you are using a binding that applies security at the transport level, all application data will be secured according to the capabilities of the transport.

  • Wenn Sie eine Bindung verwenden, die die Sicherheit auf der Nachrichtenebene anwendet, werden alle Anwendungsdaten den im Vertrag festgelegten Schutzebenen entsprechend geschützt.If you use a binding that applies security at the message level, then application data will be secured according to the protection levels set on the contract. Wenn Sie keine Schutzebene festlegen, werden alle Anwendungsdaten in den Nachrichten verschlüsselt und signiert.If you do not specify a protection level, then all application data in the messages will be encrypted and signed.

  • ProtectionLevel kann auf anderen bewertenden Ebenen festgelegt werden.The ProtectionLevel can be set at different scoping levels. Dem Bewerten ist eine Hierarchie zugeordnet. Diese wird im nächsten Abschnitt erklärt.There is a hierarchy associated with scoping, which is explained in the next section.

BewertenScoping

Durch Festlegen von ProtectionLevel auf der obersten API wird die Ebene für alle untergeordneten Ebenen festgelegt.Setting the ProtectionLevel on the topmost API sets the level for all levels below it. Wenn ProtectionLevel auf einer untergeordneten Ebene auf einen anderen Wert festgelegt ist, werden alle APIs unterhalb dieser Ebene in der Hierarchie auf die neue Ebene geändert (APIs oberhalb dieser Ebene richten sich nach wie vor nach der obersten Ebene).If the ProtectionLevel is set to a different value at a lower level, all APIs below that level in the hierarchy will now be reset to the new level (APIs above it, however, will still be affected by the topmost level). Die Hierarchie lautet wie folgt.The hierarchy is as follows. Attribute auf der gleichen Ebene sind Peers.Attributes at the same level are peers.

ServiceContractAttribute

OperationContractAttribute

FaultContractAttribute

MessageContractAttribute

MessageHeaderAttribute

MessageBodyMemberAttribute

Programmieren von ProtectionLevelProgramming ProtectionLevel

Zum Programmieren von ProtectionLevel an einem beliebigen Punkt der Hierarchie legen Sie die Eigenschaft beim Anwenden des Attributs einfach auf einen entsprechenden Wert fest.To program the ProtectionLevel at any point in the hierarchy, simply set the property to an appropriate value when applying the attribute. Beispiele finden Sie unter Vorgehensweise: Festlegen der ProtectionLevel-Eigenschaft.For examples, see How to: Set the ProtectionLevel Property.

Hinweis

Um die Eigenschaft für Fehler- und Nachrichtenverträge festlegen zu können, müssen Sie die Funktionsweise dieser Funktionen verstehen.Setting the property on faults and message contracts requires understanding how those features work. Weitere Informationen finden Sie unter Vorgehensweise: Festlegen der ProtectionLevel-Eigenschaft und Verwendung von Nachrichtenverträgen.For more information, see How to: Set the ProtectionLevel Property and Using Message Contracts.

WS-AdressierungsabhängigkeitWS-Addressing Dependency

In den meisten Fällen verwenden die ServiceModel Metadata Utility Tool (Svcutil.exe) zum Generieren eines Clients wird sichergestellt, dass der Client und Dienst Verträge identisch sind.In most cases, using the ServiceModel Metadata Utility Tool (Svcutil.exe) to generate a client ensures that the client and service contracts are identical. Scheinbar identische Verträge können jedoch den Client veranlassen, eine Ausnahme auszulösen.However, seemingly identical contracts can cause the client to throw an exception. Dies ist der Fall, wenn eine Bindung die WS-Adressierungsspezifikation nicht unterstützt und mehrere Schutzebenen für den Vertrag festgelegt sind.This occurs whenever a binding does not support the WS-Addressing specification and multiple levels of protection are specified on the contract. Beispielsweise unterstützt die BasicHttpBinding-Klasse die Spezifikation nicht oder wenn Sie eine benutzerdefinierte Bindung erstellen, die die WS-Adressierung nicht unterstützt.For example, the BasicHttpBinding class does not support the specification, or if you create a custom binding that does not support WS-Addressing. Die ProtectionLevel-Funktion ist von der WS-Adressierungsspezifikation abhängig, um andere Schutzebenen für einen einzelnen Vertrag zu aktivieren.The ProtectionLevel feature relies on the WS-Addressing specification to enable different protection levels on a single contract. Wenn die Bindung die WS-Adressierungsspezifikation nicht unterstützt, werden alle Ebenen auf dieselbe Schutzebene festgelegt.If the binding does not support the WS-Addressing specification, all levels will be set to the same protection level. Die effektive Schutzebene für alle Bereiche des Vertrags wird auf die höchste Schutzebene festgelegt, die für den Vertrag verwendet wird.The effective protection level for all scopes on the contract will be set to the strongest protection level used on the contract.

Dies verursacht möglicherweise ein Problem, das auf den ersten Blick schwer zu debuggen ist.This may cause a problem that is hard to debug at first glance. Es ist möglich, einen Dienstvertrag (eine Schnittstelle) zu erstellen, der Methoden für mehrere Dienste umfasst,It is possible to create a client contract (an interface) that includes methods for more than one service. d. h. dieselbe Schnittstelle wird zum Erstellen eines Clients verwendet, der mit vielen Diensten kommuniziert, und die einzelne Schnittstelle umfasst Methoden für alle Dienste.That is, the same interface is used to create a client that communicates with many services, and the single interface contains methods for all services. Der Entwickler muss in diesem seltenen Fall darauf achten, nur die Methoden aufzurufen, die für die einzelnen Dienste gelten.The developer must take care in this rare scenario to invoke only those methods that are applicable for each particular service. Wenn die Bindung die BasicHttpBinding-Klasse ist, können mehrere Schutzebenen nicht unterstützt werden.If the binding is the BasicHttpBinding class, multiple protection levels cannot be supported. Ein auf den Client antwortender Dienst kann jedoch auf einen Client mit einer niedrigeren Schutzebene als erforderlich reagieren.However, a service replying to the client might respond to a client with a lower protection level than required. In diesem Fall löst der Client eine Ausnahme aus, da er eine höhere Schutzebene erwartet.In this case, the client will throw an exception because it expects a higher protection level.

Im folgenden Codebeispiel wird dieses Problem veranschaulicht.An example of the code illustrates this problem. Das folgende Beispiel zeigt einen Dienst- und einen Clientvertrag.The following example shows a service and a client contract. Wird davon ausgegangen, dass die Bindung der <BasicHttpBinding > Element.Assume that the binding is the <basicHttpBinding> element. Deshalb haben alle Vorgänge im Rahmen eines Vertrags die gleiche Schutzebene.Therefore, all operations on a contract have the same protection level. Diese einheitliche Schutzebene wird als maximale Schutzebene für alle Vorgänge bestimmt.This uniform protection level is determined as the maximum protection level across all operations.

Der Dienstvertrag lautet:The service contract is:

[ServiceContract()]
public interface IPurchaseOrder
{
    [OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
    int Price();
}
<ServiceContract()> _
Public Interface IPurchaseOrder
    <OperationContract(ProtectionLevel := ProtectionLevel.Sign)> _
    Function Price() As Integer
End Interface

Im folgenden Codebeispiel wird die Clientvertragsschnittstelle dargestellt.The following code shows the client contract interface. Beachten Sie, dass eine Tax-Methode enthalten ist, die mit einem anderen Dienst verwendet werden sollte:Note that it includes a Tax method that is intended to be used with a different service:

[ServiceContract()]
public interface IPurchaseOrder
{
    [OperationContract()]
    int Tax();

    [OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
    int Price();
}
<ServiceContract()> _
Public Interface IPurchaseOrder
    <OperationContract()> _
    Function Tax() As Integer

    <OperationContract(ProtectionLevel := ProtectionLevel.Sign)> _
    Function Price() As Integer
End Interface

Wenn der Client die Price-Methode aufruft, wird eine Ausnahme ausgelöst, sobald eine Antwort vom Dienst eingeht.When the client calls the Price method, it throws an exception when it receives a reply from the service. Der Grund hierfür liegt darin, dass der Client keine ProtectionLevel im ServiceContractAttribute angibt und daher den Standardwert (EncryptAndSign) für alle Methoden, einschließlich der Price-Methode, verwendet.This occurs because the client does not specify a ProtectionLevel on the ServiceContractAttribute, and therefore the client uses the default (EncryptAndSign) for all methods, including the Price method. Der Dienst gibt jedoch den Wert unter Verwendung der Sign-Ebene zurück, da der Dienstvertrag eine einzelne Methode definiert, deren Schutzebene auf Sign festgelegt ist.However, the service returns the value using the Sign level because the service contract defines a single method that has its protection level set to Sign. In diesem Fall löst der Client einen Fehler aus, wenn er die Antwort vom Dienst überprüft.In this case, the client will throw an error when validating the response from the service.

Siehe auchSee Also

ServiceContractAttribute
OperationContractAttribute
FaultContractAttribute
MessageContractAttribute
MessageHeaderAttribute
MessageBodyMemberAttribute
ProtectionLevel
Sichern von DienstenSecuring Services
Vorgehensweise: Festlegen der ProtectionLevel-EigenschaftHow to: Set the ProtectionLevel Property
Angeben und Behandeln von Fehlern in Verträgen und DienstenSpecifying and Handling Faults in Contracts and Services
Verwenden von NachrichtenverträgenUsing Message Contracts