Vorgehensweise: Erstellen einer benutzerdefinierten Bindung mit dem SecurityBindingElement
Windows Communication Foundation (WCF) enthält mehrere vom System bereitgestellte Bindungen, die konfiguriert werden können, aber nicht die volle Flexibilität bei der Konfiguration aller von WCF unterstützten Sicherheitsoptionen bieten. Dieses Thema veranschaulicht, wie eine benutzerdefinierte Bindung direkt aus individuellen Bindungselementen erstellt wird, und stellt einige der Sicherheitseinstellungen heraus, die bei der Erstellung einer derartigen Bindung festgelegt werden können. Weitere Informationen zum Erstellen von benutzerdefinierten Bindungen finden Sie unter Erweitern von Bindungen.
Warnung
SecurityBindingElement unterstützt die IDuplexSessionChannel-Kanalform nicht, die der standardmäßig vom TCP-Transport verwendeten Kanalform entspricht, wenn TransferMode auf Buffered festgelegt ist. Sie müssen TransferMode auf Streamed festlegen, um SecurityBindingElement in diesem Szenario verwenden.
Erstellen einer benutzerdefinierten Bindung
In WCF bestehen alle Bindungen aus Bindungselementen. Jedes Bindungselement wird von der BindingElement-Klasse abgeleitet. Bei den standardmäßigen, vom System bereitgestellten Bindungen werden die Bindungselemente für Sie erstellt und konfiguriert, einige der Eigenschaftseinstellungen können jedoch angepasst werden.
Im Gegensatz dazu werden zum Erstellen einer benutzerdefinierten Bindung Bindungselemente erstellt und konfiguriert, und aus den Bindungselementen wird eine CustomBinding erstellt.
Fügen Sie hierzu die einzelnen Bindungselemente einer Auflistung hinzu, die durch eine Instanz der BindingElementCollection-Klasse repräsentiert wird, und legen Sie anschließend die Elements
-Eigenschaft der CustomBinding
auf dieses Objekt fest. Die Bindungselemente müssen in der folgenden Reihenfolge hinzugefügt werden: Transaktionsfluss, zuverlässige Sitzung, Sicherheit, Composite Duplex, Unidirektional, Streamsicherheit, Nachrichtencodierung und Transport. Beachten Sie, dass nicht alle aufgelisteten Bindungselemente in jeder Bindung erforderlich sind.
SecurityBindingElement
Drei Bindungselemente beziehen sich auf die Sicherheit auf Nachrichtenebene, wobei alle von der SecurityBindingElement-Klasse abgeleitet werden. Die drei sind TransportSecurityBindingElement, SymmetricSecurityBindingElement und AsymmetricSecurityBindingElement. Das TransportSecurityBindingElement wird für Sicherheit im gemischten Modus verwendet. Die anderen beiden Elemente werden verwendet, wenn die Nachrichtenebene Sicherheit bereitstellt.
Zusätzliche Klassen werden verwendet, wenn Sicherheit auf Transportebene bereitgestellt wird:
Erforderliche Bindungselemente
Es gibt eine große Anzahl von möglichen Bindungselementen, die zu einer Bindung kombiniert werden können. Nicht alle Kombinationen sind zulässig. In diesem Abschnitt werden die für eine Sicherheitsbindung erforderlichen Elemente beschrieben.
Gültige Sicherheitsbindungen hängen von vielen Faktoren ab, unter anderem von folgenden:
Sicherheitsmodus
Transportprotokoll
Das im Vertrag angegebene Nachrichtenaustauschmuster (MEP)
Die folgende Tabelle enthält die gültigen Konfigurationen von Bindungselementstapeln für jede Kombination der oben genannten Faktoren. Beachten Sie, dass es sich herbei um Mindestanforderungen handelt. Sie können der Bindung weitere Bindungselemente hinzufügen (beispielsweise Elemente zur Nachrichtencodierung, Transaktionsbindungselemente usw.).
Sicherheitsmodus | Transport | Nachrichtenaustauschmuster des Vertrags | Nachrichtenaustauschmuster des Vertrags | Nachrichtenaustauschmuster des Vertrags |
---|---|---|---|---|
Datagram |
Request Reply |
Duplex |
||
Transport | HTTPS | |||
OneWayBindingElement | ||||
HttpsTransportBindingElement | HttpsTransportBindingElement | |||
TCP | ||||
OneWayBindingElement | ||||
SSL oder Windows-StreamSecurityBindingElement | SSL oder Windows-StreamSecurityBindingElement | SSL oder Windows-StreamSecurityBindingElement | ||
TcpTransportBindingElement | TcpTransportBindingElement | TcpTransportBindingElement | ||
`Message` | Http | SymmetricSecurityBindingElement | SymmetricSecurityBindingElement | SymmetricSecurityBindingElement (Authentifizierungsmodus = SecureConversation) |
CompositeDuplexBindingElement | ||||
OneWayBindingElement | OneWayBindingElement | |||
HttpTransportBindingElement | HttpTransportBindingElement | HttpTransportBindingElement | ||
TCP | SecurityBindingElement | SecurityBindingElement | SymmetricSecurityBindingElement (Authentifizierungsmodus = SecureConversation) | |
TcpTransportBindingElement | TcpTransportBindingElement | TcpTransportBindingElement | ||
Gemischt (Transport mit Nachrichtenanmeldeinformationen) | HTTPS | TransportSecurityBindingElement | TransportSecurityBindingElement | |
OneWayBindingElement | ||||
HttpsTransportBindingElement | HttpsTransportBindingElement | |||
TCP | TransportSecurityBindingElement | SymmetricSecurityBindingElement (Authentifizierungsmodus = SecureConversation) | SymmetricSecurityBindingElement (Authentifizierungsmodus = SecureConversation) | |
OneWayBindingElement | ||||
SSL oder Windows-StreamSecurityBindingElement | SSL oder Windows-StreamSecurityBindingElement | SSL oder Windows-StreamSecurityBindingElement | ||
TcpTransportBindingElement | TcpTransportBindingElement | TcpTransportBindingElement |
Beachten Sie, dass für SecurityBindingElements eine Vielzahl konfigurierbarer Einstellungen zur Verfügung stehen. Weitere Informationen finden Sie unter SecurityBindingElement-Authentifizierungsmodi.
Weitere Informationen finden Sie unter Sichere Konversationen und sichere Sitzungen.
Prozeduren
So erstellen Sie eine benutzerdefinierte Bindung mit dem SymmetricSecurityBindingElement
Erstellen Sie eine Instanz der BindingElementCollection-Klasse mit dem Namen
outputBec
.Rufen Sie die statische
M:System.ServiceModel.Channels.SecurityBindingElement.CreateSspiNegotiationBindingElement(true)
-Methode auf, durch die eine Instanz der SymmetricSecurityBindingElement-Klasse zurückgegeben wird.Fügen Sie das SymmetricSecurityBindingElement zur Sammlung hinzu (
outputBec
), indem Sie dieAdd
-Methode der Collection<T> der BindingElement-Klasse aufrufen.Erstellen Sie eine Instanz der TextMessageEncodingBindingElement-Klasse, und fügen Sie diese der Sammlung hinzu (
outputBec
). Dies gibt die von der Bindung verwendete Codierung an.Erstellen Sie ein HttpTransportBindingElement, und fügen Sie es der Sammlung hinzu (
outputBec
). Dadurch wird angegeben, dass die Bindung den HTTP-Transport nutzt.Erstellen Sie eine neue benutzerdefinierte Bindung, indem Sie eine Instanz der CustomBinding-Klasse erstellen und die Sammlung
outputBec
an den Konstruktor weitergeben.Die resultierenden benutzerdefinierten Bindungen teilen sich viele Eigenschaften mit dem Standard WSHttpBinding. Sicherheit wird auf Nachrichtenebene und Windows-Anmeldeinformationen festgelegt, aber sichere Sitzungen werden deaktiviert, eine Out-of-Band-Festlegung der Dienstanmeldeinformationen ist erforderlich und Signaturen werden nicht verschlüsselt. Die letzte kann nur durch Festlegen der MessageProtectionOrder-Eigenschaft gesteuert werden, wie in Schritt 4 angezeigt. Die anderen beiden können über Einstellungen auf der Standardbindung kontrolliert werden.
Beispiel
Beschreibung
Das folgende Beispiel veranschaulicht eine vollständige Funktion zur Erstellung einer benutzerdefinierten Bindung, die ein SymmetricSecurityBindingElement nutzt.
Code
// Create an empty CustomBinding to populate
CustomBinding binding = new CustomBinding();
// Create a SymmetricSecurityBindingElement.
SymmetricSecurityBindingElement ssbe =
SecurityBindingElement.CreateSspiNegotiationBindingElement(true);
// Add the SymmetricSecurityBindingElement to the BindingElementCollection.
binding.Elements.Add(ssbe);
binding.Elements.Add(new TextMessageEncodingBindingElement());
binding.Elements.Add(new HttpTransportBindingElement());
return new CustomBinding(binding);
Public Shared Function CreateCustomBinding() As Binding
' Create an empty Custom Binding to populate,
Dim binding As New CustomBinding()
' Create a SymmetricSecurityBindingElement.
Dim ssbe As SymmetricSecurityBindingElement
ssbe = SecurityBindingElement.CreateSspiNegotiationBindingElement(True)
' Add the SymmetricSecurityBindingElement to the BindingElementCollection.
binding.Elements.Add(ssbe)
binding.Elements.Add(New TextMessageEncodingBindingElement())
binding.Elements.Add(New HttpTransportBindingElement())
Return New CustomBinding(binding)
End Function