Grundlagen der Schutzebene
Die ProtectionLevel
-Eigenschaft ist in vielen anderen Klassen zu finden, z. B. die ServiceContractAttribute-Klasse und die OperationContractAttribute-Klasse. Die Eigenschaft steuert, wie eine Nachricht zum Teil (oder ganz) geschützt wird. Dieses Thema erklärt die Funktion der Windows Communication Foundation (WCF) und ihre Funktionsweise.
Anweisungen zum Festlegen der Schutzebene finden Sie unter Vorgehensweise: Festlegen der ProtectionLevel-Eigenschaft.
Hinweis
Schutzebenen können nur im Code, nicht in der Konfiguration festgelegt werden.
Grundeinstellungen
Um die Schutzebenenfunktion zu verstehen, sind die folgenden grundlegenden Anweisungen wichtig:
Drei grundlegende Ebenen des Schutzes sind für jeden Teil einer Nachricht vorhanden. Die Eigenschaft wird (bei jedem Auftreten) auf einen der ProtectionLevel-Enumerationswerte festgelegt. In aufsteigender Reihenfolge des Schutzes umfassen sie:
None
.Sign
. Der geschützte Teil wird digital signiert. Dies stellt sicher, dass eine Manipulation am Nachrichtenteil erkannt wird.EncryptAndSign
. Der Nachrichtenteil wird verschlüsselt, um Vertraulichkeit sicherzustellen, bevor er signiert wird.
Sie können Schutzanforderungen nur für Anwendungsdaten mit dieser Funktion festlegen. WS-Adressierungsheader sind z. B. Infrastrukturdaten und werden deshalb nicht vom
ProtectionLevel
beeinflusst.Wenn der Sicherheitsmodus auf
Transport
festgelegt wird, wird die ganze Nachricht vom Transportmechanismus geschützt. Deshalb hat das Festlegen einer separaten Schutzebene für andere Teile einer Nachricht keine Auswirkungen.Die
ProtectionLevel
stellt eine Möglichkeit für den Entwickler dar, die Mindestebene festzulegen, die eine Bindung aufweisen muss. Beim Bereitstellen eines Diensts kann die tatsächliche in der Konfiguration angegebene Bindung die Mindestebene unterstützen oder nicht. Standardmäßig stellt die BasicHttpBinding-Klasse keine Sicherheit bereit (diese kann allerdings aktiviert werden). Die Verwendung dieser Klasse in Verbindung mit einem Vertrag, der eine andere Einstellung alsNone
hat, löst eine Ausnahme aus.Wenn es der Dienst erfordert, dass die kleinste
ProtectionLevel
für alle NachrichtenSign
ist, kann ein Client (der möglicherweise von einer Nicht--Technologie erstellt wurde) alle Nachrichten verschlüsseln und signieren (was über die erforderliche Mindestebene hinausgeht). In diesem Fall löst WCF keine Ausnahme aus, da der Client über die Mindestebene hinausgeht. Beachten Sie jedoch, dass WCF-Anwendungen (Dienste oder Clients) einen Nachrichtenteil nicht übermäßig schützen, sofern möglich, sondern die Mindestebene einhalten. Außerdem ist zu beachten, dass der Transport den Nachrichtenstrom bei Verwendung vonTransport
als Sicherheitsmodus übermäßig schützt, da in diesem Fall ein Schutz auf niedrigerer Ebene nicht möglich ist.Wenn Sie
ProtectionLevel
ausdrücklich entweder aufSign
oderEncryptAndSign
festlegen, müssen Sie eine Bindung mit aktivierter Sicherheit verwenden. Andernfalls wird eine Ausnahme ausgelöst.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.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 dieProtectionLevel
nicht ausdrücklich festgelegt ist, werden keine Anwendungsdaten geschützt.Bei Verwendung einer Bindung, die Sicherheit auf der Transportebene anwendet, werden alle Anwendungsdaten den Transportfunktionen entsprechend geschützt.
Wenn Sie eine Bindung verwenden, die die Sicherheit auf der Nachrichtenebene anwendet, werden alle Anwendungsdaten den im Vertrag festgelegten Schutzebenen entsprechend geschützt. Wenn Sie keine Schutzebene festlegen, werden alle Anwendungsdaten in den Nachrichten verschlüsselt und signiert.
ProtectionLevel
kann auf anderen bewertenden Ebenen festgelegt werden. Dem Bewerten ist eine Hierarchie zugeordnet. Diese wird im nächsten Abschnitt erklärt.
Bereichsdefinition
Durch Festlegen von ProtectionLevel
auf der obersten API wird die Ebene für alle untergeordneten Ebenen festgelegt. 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). Die Hierarchie lautet wie folgt. Attribute auf der gleichen Ebene sind Peers.
Programmieren von 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. Beispiele finden Sie unter Vorgehensweise: Festlegen der ProtectionLevel-Eigenschaft.
Hinweis
Um die Eigenschaft für Fehler- und Nachrichtenverträge festlegen zu können, müssen Sie die Funktionsweise dieser Funktionen verstehen. Weitere Informationen finden Sie unter Vorgehensweise: Festlegen der ProtectionLevel-Eigenschaft und Verwenden von Nachrichtenverträgen.
WS-Adressierungsabhängigkeit
In den meisten Fällen wird durch die Verwendung des ServiceModel Metadata Utility Tool (Svcutil.exe) zur Erstellung eines Clients sichergestellt, dass der Client und die Serviceverträge identisch sind. Scheinbar identische Verträge können jedoch den Client veranlassen, eine Ausnahme auszulösen. Dies ist der Fall, wenn eine Bindung die WS-Adressierungsspezifikation nicht unterstützt und mehrere Schutzebenen für den Vertrag festgelegt sind. Beispielsweise unterstützt die BasicHttpBinding-Klasse die Spezifikation nicht oder wenn Sie eine benutzerdefinierte Bindung erstellen, die die WS-Adressierung nicht unterstützt. Die ProtectionLevel
-Funktion ist von der WS-Adressierungsspezifikation abhängig, um andere Schutzebenen für einen einzelnen Vertrag zu aktivieren. Wenn die Bindung die WS-Adressierungsspezifikation nicht unterstützt, werden alle Ebenen auf dieselbe Schutzebene festgelegt. Die effektive Schutzebene für alle Bereiche des Vertrags wird auf die höchste Schutzebene festgelegt, die für den Vertrag verwendet wird.
Dies verursacht möglicherweise ein Problem, das auf den ersten Blick schwer zu debuggen ist. Es ist möglich, einen Dienstvertrag (eine Schnittstelle) zu erstellen, der Methoden für mehrere Dienste umfasst, 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. Der Entwickler muss in diesem seltenen Fall darauf achten, nur die Methoden aufzurufen, die für die einzelnen Dienste gelten. Wenn die Bindung die BasicHttpBinding-Klasse ist, können mehrere Schutzebenen nicht unterstützt werden. Ein auf den Client antwortender Dienst kann jedoch auf einen Client mit einer niedrigeren Schutzebene als erforderlich reagieren. In diesem Fall löst der Client eine Ausnahme aus, da er eine höhere Schutzebene erwartet.
Im folgenden Codebeispiel wird dieses Problem veranschaulicht. Das folgende Beispiel zeigt einen Dienst- und einen Clientvertrag. Angenommen, die Bindung ist das <basicHttpBinding-Element> . Deshalb haben alle Vorgänge im Rahmen eines Vertrags die gleiche Schutzebene. Diese einheitliche Schutzebene wird als maximale Schutzebene für alle Vorgänge bestimmt.
Der Dienstvertrag lautet:
[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. Beachten Sie, dass eine Tax
-Methode enthalten ist, die mit einem anderen Dienst verwendet werden sollte:
[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. 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. 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. In diesem Fall löst der Client einen Fehler aus, wenn er die Antwort vom Dienst überprüft.
Siehe auch
- ServiceContractAttribute
- OperationContractAttribute
- FaultContractAttribute
- MessageContractAttribute
- MessageHeaderAttribute
- MessageBodyMemberAttribute
- ProtectionLevel
- Sichern von Diensten
- Vorgehensweise: Festlegen der ProtectionLevel-Eigenschaft
- Angeben und Behandeln von Fehlern in Verträgen und Diensten
- Verwendung von Nachrichtenverträgen