Peerkanal-Nachrichtenauthentifizierung
Dieses Beispiel zeigt die Verwendung der NetPeerTcpBinding-Bindung mit nachrichtenbasierter Authentifizierung, die Mehrparteienkommunikation mithilfe des Peerkanals bietet. Dieses Beispiel ist eine Variante des Beispiel 'Erste Schritte'. Unter Beispiel 'Erste Schritte' finden Sie eine Übersicht über Windows Communication Foundation (WCF).
In diesem Beispiel sind die Anwendungsinstanzen selbst gehostete Konsolenanwendungen.
Anders als bei den anderen Transportbindungsbeispielen wird in diesem Beispiel die IQuoteChange
-Vertragsschnittstelle verwendet, um Mehrparteienkommunikation zu veranschaulichen. Alle Instanzen implementieren diesen Vertrag, um Nachrichten zu empfangen, und erstellen Proxys desselben Vertrags, um Nachrichten zum Netz zu senden. Dies wird durch Erstellen eines Duplexkanals zum Netz veranschaulicht.
Tipp
Die Setupprozedur und die Buildanweisungen für dieses Beispiel befinden sich am Ende dieses Themas.
Der Bindungskonfigurationsprozess im Beispiel beinhaltet die folgenden Peerkanal-Begriffe:
- Der Peerresolver ist zum Auflösen einer Mesh-ID in die Endpunktadressen einiger Knoten im Mesh verantwortlich.
- Ein Mesh ist eine benannte Auflistung von Peerknoten, die durch die Mesh-ID gekennzeichnet wird.
- Ein Peerknoten ist eine Instanz einer Anwendung, die am Mesh beteiligt ist.
- Mesh-IDs identifizieren den Hostteil der Adresse eines Endpunkts im Mesh. Beispiele für solche Adressen sind "net.p2p://chatMesh/servicemodelsamples/chat" oder "net.p2p://broadcastMesh/servicemodelsamples/announcements". "chatMesh" und "broadcastMesh" sind die Mesh-IDs.
- Alle an einem Mesh beteiligten Clients verwenden dieselbe Mesh-ID, können aber u. U. andere Pfade und Dienste verwenden. Eine an eine bestimmte Endpunktadresse adressierte Nachricht wird an alle Clients übermittelt, die diese Adresse verwenden.
Wenn ein Peerknoten geöffnet wird, verwendet er einen Peerresolver, um die Netz-ID in eine Liste mit den Adressen anderer Peerknoten im Netz aufzulösen. Auf diese Weise können Nachrichten über das Netz weitergegeben werden.
PeerTransportCredentialType gibt an, wie Peers im Netz gegenseitig authentifiziert werden. Diese Eigenschaft kann entweder in den Bindungsinformationen, einem NetPeerTcpBinding-Objekt oder mithilfe eines PeerTransportBindingElement-Elements angegeben werden. Je nach der Verwendung muss der Verhaltensauflistung in der Kanalfactory oder dem Diensthost eine ClientCredentialSettings-Instanz (oder ServiceCredentialSettings-Instanz) mit entsprechenden, in der Peer-Eigenschaft angegebenen Anmeldeinformationen hinzugefügt werden.
Der Peerkanal unterstützt die folgenden Authentifizierungsmodi in der PeerTransportCredentialType-Klasse:
- Password. Dies ist der Standardauthentifizierungsmodus für den Peerkanal. In diesem Modus wird von allen Teilnehmern im Netz die Kenntnis eines geheimen Kennworts erwartet. Dies wird realisiert, indem zwischen Nachbarn eine sichere Verbindung hergestellt und eine Transformation dieses Kennworts ausgetauscht wird. Wenn Password angegeben ist, muss die ClientCredentialSettings.Peer-Eigenschaft ein gültiges Kennwort und optional eine X509Certificate2-Instanz (mithilfe von SetSelfCertificate) enthalten.
- Certificate. In diesem Modus wird beim Herstellen von Peerverbindungen eine anwendungsspezifische Authentifizierung ausgeführt. Wenn dieser Modus angegeben ist, müssen Anwendungen eine konkrete Implementierung von X509Certificate2Validator in ClientCredentialSettings.Peer.PeerAuthentication angeben, die der Kanalfactory hinzugefügt wird.
Wenn die Eigenschaft NetPeerTcpBinding.Security.Mode
als SecurityMode.Message
oder SecurityMode.TransportWithMessageCredential
festgelegt ist, können Anwendungen ausgehende Nachrichten signieren und eingehende Nachrichten überprüfen.
Wenn ausgehende Nachrichten signiert werden, wird eine Instanz von mit ClientCredentialSettings.Peer.SetSelfCertificate()
angegebenem X509Certificate2
verwendet.
Das Signieren von Nachrichten wird mit einer Instanz von X509Certificate2
ausgeführt. Zum Signieren ausgehender Nachrichten (bei OutputChannel
oder DuplexChannel
) muss die Anwendung die zum Signieren verwendeten Anmeldeinformationen mithilfe von PeerCredential.SetSelfCertificate().
angeben.
Zum Überprüfen von Nachrichten (InputChannel
oder DuplexChannel
) müssen Anwendungen eine konkrete Implementierung von X509Certificate2Validator
angeben, die die Quelle der Nachrichten überprüft und mit ServiceCredentialSettings.Peer.MessageSenderAuthentication()
angegeben wird.
Die Bindung wird in den Konfigurationsdateien des Senders und der Empfänger angegeben. Der Bindungstyp wird im binding
-Attribut des Elements endpoint
angegeben (siehe folgendes Beispiel).
<services>
<service name="Microsoft.ServiceModel.Samples.BroadcastReceiver">
<!-- use base address provided by the host -->
<endpoint address="Stocks"
binding="netPeerTcpBinding"
bindingConfiguration="Binding1"
contract="Microsoft.ServiceModel.Samples.IQuoteChange" />
</service>
</services>
Wenn Sie die NetPeerTcpBinding
-Bindung mit dem Standardverhalten verwenden, ist kennwortbasierte Sicherheit aktiviert. Das Element binding
enthält Attribute zum Festlegen des Ports, der zu überwachenden IP-Adresse, des Resolvertyps, der maximalen Größe von Nachrichten, der maximalen Größe des Pufferpools, von Readerkontigenten, des Peerknoten-Authentifizierungsmodus, von Nachrichtenauthentifizierung und von Timeoutwerten (für Schließ-, Öffnungs-, Sende- und Empfangsvorgänge).
Tipp
In diesem Beispiel wird der Standardpeerresolver (PNRP) verwendet, der in WCF nicht verfügbar ist. Daher müssen Sie zum Ausführen dieses Beispiels unter WCF einen benutzerdefinierten Peerresolver verwenden. Ein Beispiel, in dem ein benutzerdefinierter Peerresolver verwendet wird, finden Sie unter Peerkanalchat, z. B.:
<netPeerTcpBinding>
<binding configurationName="Binding1">
<resolver mode="Custom">
<customResolver type=
"MyAppNameSpace.MyCustomPeerResolver, myApp"/>
</resolver>
</binding>
</netPeerTcpBinding>
Die Datei, die MyCustomPeerResolver
enthält, muss mit dem Sender und den Empfängern kompiliert werden. Falls dieses Beispiel auf mehreren Computern mit unterschiedlichen Plattformen ausgeführt wird, beachten Sie, dass alle denselben Resolver verwenden müssen.
Die Empfänger- und Senderimplementierungen zeigen auch, wie der der Empfänger- bzw. Senderinstanz zugehörige Peerknoten abgerufen wird und wie die Registrierung für dessen Online- und Offlineereignisse erfolgt. Ein Onlineereignis wird initiiert, wenn der Peerknoten eine Verbindung mit mindestens einem anderen im Mesh befindlichen Peerknoten herstellt. Ein Offlineereignis wird initiiert, wenn der Peerknoten mit keinem anderen im Mesh befindlichen Peerknoten mehr verbunden ist.
Zu diesem Zeitpunkt ist der Peerkanal nicht in das Service Model Metadata Utility Tool (Svcutil.exe) integriert. Daher kann "Svcutil.exe" nicht genutzt werden, um einen typisierten Kanal für den Sender zu generieren.
Wenn Sie das Beispiel ausführen, zeigt der Absender die Nachricht an, dass es bereit ist, Nachrichten zu senden. Geben Sie Werte gefolgt von der EINGABETASTE ein, um den aktuellen Lagerwert an die Empfängerclients zu senden. Aktualisierungen werden in den anderen Clientkonsolenfenstern angezeigt. Zum Beenden des Clients geben Sie in den Konsolenfenstern des Absenders einen leeren Wert ein (oder drücken Sie bei einem Empfängerclient die EINGABETASTE).
Wenn Sie Ablaufverfolgung oder Nachrichtenprotokollierung aktivieren, können Sie die Sender- und Empfängeraktivität auf einer tieferen Ebene überwachen. Die folgenden Verfahren beschreiben, wie Ablaufverfolgung und Nachrichtenprotokollierung aktiviert werden.
Tipp
Beachten Sie dabei unbedingt, dass derzeit nicht alle möglichen Ausnahmen, die die Infrastruktur u. U. auslöst, vom Beispiel verarbeitet werden. Wenn Sie diese Beispiele in einer kommerziellen oder Produktionsumgebung verwenden, folgen Sie bitte den bewährten Methoden zur korrekten Ausnahmebehandlung.
So richten Sie das Beispiel ein, erstellen es und führen es aus
Stellen Sie sicher, dass Sie Beispiele zum einmaligen Setupverfahren für Windows Communication Foundation ausgeführt haben.
Zum Erstellen der C#- oder Visual Basic .NET-Version der Lösung folgen Sie den in Erstellen der Windows Communication Foundation-Beispiele aufgeführten Anweisungen.
Wenn Sie das Beispiel in einer Konfiguration mit einem einzigen Computer ausführen möchten, folgen Sie den in Durchführen der Windows Communication Foundation-Beispiele aufgeführten Anweisungen.
So installieren Sie PNRP unter Windows XP SP2 (einmaliges Setup):
- Doppelklicken Sie in der Systemsteuerung auf Software.
- Klicken Sie im Dialogfeld Software auf Windows-Komponenten hinzufügen/entfernen.
- Aktivieren Sie im Assistenten für Windows-Komponenten das Kontrollkästchen Netzwerkdienste, und klicken Sie auf Details.
- Aktivieren Sie das Kontrollkästchen Peer-to-Peer, und klicken Sie auf OK.
- Klicken Sie im Assistenten für Windows-Komponenten auf Weiter.
- Wenn die Installation abgeschlossen ist, klicken Sie auf Fertig stellen.
- Starten Sie den PNRP-Dienst in einer Eingabeaufforderung mit dem folgenden Befehl: net start pnrpsvc.
Wenn in Schritt 3 von Client und Dienst die Rede ist, sind damit Sender und Empfänger gemeint.
Beim ersten Ausführen dieses Beispiels müssen Sie "Setup.bat" ausführen, um Zertifikate zu erstellen und zu registrieren, die von diesem Beispiel verwendet werden. Wenn das Beispiel auf mehreren Computern verwendet wird, führen Sie "Setup.bat" nur auf einem Computer aus, und exportieren Sie das generierte Zertifikat auf die anderen verwendeten Computer. Der Grund dafür ist, dass "Setup.bat" bei jeder Ausführung ein zufälliges Zertifikat generiert und registriert.
Starten Sie den (oder die) Empfänger und den Sender. Wenn die Instanzen eine Verbindung herstellen, geben Sie in der Konsole der Senderanwendung Werte ein, um Aktualisierungen an die Empfänger zu senden. Vom Sender gesendete Chatnachrichten werden von allen Empfängern empfangen.
Führen Sie "Cleanup.bat" aus, um die von diesem Beispiel erstellten Zertifikate zu entfernen.
Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.