次の方法で共有


ピア チャネル メッセージの認証

Download sample

このサンプルでは、ピア チャネルを使用してマルチパーティ通信を実現する、NetPeerTcpBinding バインディングをメッセージ ベースの認証で使用する方法を示します。このサンプルは、「入門サンプル」の変化形です。Windows Communication Foundation (WCF) の概要については、「入門サンプル」を参照してください。

このサンプルでは、アプリケーション インスタンスは、自己ホスト型コンソール アプリケーションです。

他のトランスポート バインディング サンプルとは異なり、このサンプルではマルチパーティ通信を表す目的で IQuoteChange コントラクト インターフェイスが使用されます。すべてのインスタンスでは、メッセージを受信して、同じコントラクトのプロキシを作成してメッセージをメッシュに送信するために、このコントラクトが実装されます。これは、メッシュへの二重チャネルを作成することで表されます。

Noteメモ :

このサンプルのセットアップ手順とビルド手順については、このトピックの最後を参照してください。

このサンプルでバインディングの構成プロセスを理解するには、次のピア チャネルの概念を理解する必要があります。

  • ピア リゾルバは、メッシュ ID をメッシュ内のノードのエンドポイント アドレスに解決します。

  • メッシュは、メッシュ ID によって識別されるピア ノードの名前付きコレクションです。

  • ピア ノードは、メッシュに参加するアプリケーションのインスタンスです。

  • メッシュ ID は、メッシュ内のエンドポイント アドレスのホスト部分を識別します。こうしたアドレスの例としては、"net.p2p://chatMesh/servicemodelsamples/chat" や "net.p2p://broadcastMesh/servicemodelsamples/announcements" などがあります。chatMesh と broadcastMesh はメッシュ ID です。

  • メッシュに参加するすべてのクライアントでは、同じメッシュ ID を使用しますが、異なるパスとサービスを使用できる場合もあります。特定のエンドポイント アドレス宛てのメッセージは、そのアドレスを使用するすべてのクライアントに配信されます。

開いているピア ノードは、ピア リゾルバを使用してメッシュ ID を解決して、メッシュ内の他のピア ノードのアドレス リストを取得します。これにより、メッセージがメッシュ内で伝達されるようになります。

PeerTransportCredentialType では、メッシュ内のピアが互いに認証する方法を指定します。このプロパティはバインディング構成または NetPeerTcpBinding オブジェクトのどちらでも指定できます。または、PeerTransportBindingElement バインディング要素を使用して指定することもできます。Peer プロパティで指定された適切な資格情報を持つ ClientCredentialSettings (または ServiceCredentialSettings) インスタンスは、使用方法に応じて、チャネル ファクトリまたはサービス ホストの動作コレクションに追加する必要があります。

ピア チャネルは、PeerTransportCredentialType クラスで次の認証モードをサポートします。

  1. Password。これは、ピア チャネルの既定の認証モードです。このモードでは、メッシュ内のすべての参加者が秘密パスワードを知っているかどうかを確認する必要があります。これは、隣接ノード間でセキュリティで保護された接続を確立し、このパスワードの変換を行うことにより、実現されます。Password が指定されると、ClientCredentialSettings.Peer プロパティは有効なパスワードと、必要に応じて X509Certificate2 インスタンスを転送する必要があります (SetSelfCertificate を使用)。

  2. Certificate。このモードでは、ピア接続を確立するときに、アプリケーション固有の認証が実行されます。このモードを指定した場合、アプリケーションでは、チャネル ファクトリに追加されている ClientCredentialSettings.Peer.PeerAuthenticationX509Certificate2Validator の具体的な実装を指定する必要があります。

アプリケーションでは、NetPeerTcpBinding.Security.Mode プロパティが SecurityMode.Message または SecurityMode.TransportWithMessageCredential に設定されている場合、送信メッセージに署名して受信メッセージを検証できます。

送信メッセージの署名には、ClientCredentialSettings.Peer.SetSelfCertificate() で指定された X509Certificate2 のインスタンスが使用されます。

メッセージの署名は、X509Certificate2 のインスタンスを使用して実行されます。送信メッセージに署名する場合 (OutputChannel または DuplexChannel の場合)、アプリケーションでは、PeerCredential.SetSelfCertificate() による署名に使用する証明書を指定する必要があります。

受信メッセージを検証する場合 (InputChannel または DuplexChannel の場合)、アプリケーションでは、X509Certificate2Validator の具体的な実装を指定する必要があります。この検証はメッセージのソースを検証するもので、ServiceCredentialSettings.Peer.MessageSenderAuthentication() を使用して指定されます。

バインディングは、送信側と受信側の構成ファイルに指定されます。バインディングの種類は、endpoint 要素の binding 属性で指定します。次のサンプル構成を参照してください。

<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>

既定の動作で NetPeerTcpBinding バインディングを使用する場合、パスワード ベースのセキュリティが有効です。binding 要素には、ポート、リッスンする IP アドレス、リゾルバの種類、最大メッセージ サイズ、最大バッファ プール サイズ、リーダー クォータ、ピア ノード認証モード、メッセージ認証、およびタイムアウト (閉じる、開く、送信、受信) の属性が用意されています。

Noteメモ :

このサンプルでは既定のピア リゾルバ (PNRP) を使用します。これは WCF では利用できません。したがって、このサンプルを WCF で実行する場合は、カスタム ピア リゾルバを使用する必要があります。カスタム ピア リゾルバを使用するサンプルについては、「ピア チャネル チャット」を参照してください。たとえば、次のようになります。

<netPeerTcpBinding>
    <binding configurationName="Binding1"> 
        <resolver mode="Custom">
            <customResolver type=
                  "MyAppNameSpace.MyCustomPeerResolver, myApp"/>
        </resolver>
    </binding>
</netPeerTcpBinding>

MyCustomPeerResolver が含まれるファイルは、送信側と受信側でコンパイルする必要があります。サンプルをプラットフォームが異なる複数のコンピュータで実行する場合は、各コンピュータで同じリゾルバを使用する必要があります。

受信側と送信側での実装では、受信側または送信側のインスタンスに関連付けられたピア ノードを取得する方法と、そのピア ノードのオンライン イベントとオフライン イベントでの登録方法も示されます。ピア ノードがメッシュ内の少なくとも 1 つのピア ノードに接続されると、オンライン イベントが発生します。ピア ノードがメッシュ内のすべてのピア ノードとの接続を失うと、オフライン イベントが発生します。

現時点では、ピア チャネルはService Model Metadata Utility Tool (Svcutil.exe) と統合されていません。このため、型指定されたチャネルを送信側用に生成するために Svcutil.exe を使用することはできません。

サンプルを実行すると、メッセージを送信する準備ができたことを示すメッセージが送信側に表示されます。値を入力して Enter キーを押すと、現在の株価が受信側のクライアントに送信されます。更新内容が、他のクライアント コンソール ウィンドウに表示されます。クライアントを終了するには、送信側のコンソール ウィンドウで空白の値を入力します (または受信側のクライアントで、Enter キーを押します)。

トレースまたはメッセージ ログを有効にすると、送信側や受信側のアクティビティをより詳細に監視できます。次の手順では、トレースやメッセージ ログを有効にする方法について説明します。

Noteメモ :

このサンプルでは現在、インフラストラクチャでスローされる可能性のあるすべての例外が扱われているわけではないことに注意してください。これらのサンプルを商用/本運用環境で使用する場合は、適切な例外処理に関するベスト プラクティスに従うようにしてください。

サンプルを設定、ビルド、および実行するには

  1. Windows Communication Foundation サンプルの 1 回限りのセットアップの手順」が実行済みであることを確認します。

  2. ソリューションの C# 版または Visual Basic .NET 版をビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。

  3. 単一コンピュータ構成でサンプルを実行するには、「Windows Communication Foundation サンプルの実行」の手順に従います。

  4. Windows XP SP2 で PNRP をインストールするには (1 回限りのセットアップ):

    1. [コントロール パネル][プログラムの追加と削除] をダブルクリックします。

    2. [プログラムの追加と削除] ダイアログ ボックスで [Windows コンポーネントの追加と削除] をクリックします。

    3. Windows コンポーネント ウィザードで、[ネットワーク サービス] チェック ボックスをオンにし、[詳細] をクリックします。

    4. [ピア ツー ピア] チェック ボックスをオンにして、[OK] をクリックします。

    5. [Windows コンポーネント ウィザード][次へ] をクリックします。

    6. インストールが完了したら、[完了] をクリックします。

    7. コマンド シェル プロンプトで、コマンド net start pnrpsvc を実行して PNRP サービスを起動します。

  5. 手順 3. でクライアントとサービスに言及されている場合、それらの手順は送信側と受信側に適用されます。

  6. このサンプルを最初に実行する場合、Setup.bat を実行し、サンプルにより使用される証明書を作成して登録します。複数のコンピュータでサンプルを使用する場合、1 台のコンピュータでのみ Setup.bat を実行して、生成された証明書を、他に使用するすべてのコンピュータにエクスポートします。Setup.bat では証明書がランダムに作成されるので、Setup.bat を実行するたびに一意の証明書が生成されて登録されるためです。

  7. 受信側 (複数可) と送信側を起動します。インスタンスが接続されたら、送信元アプリケーションのコンソールで値を入力して、更新内容を受信側に送信します。送信側から送信されたチャット メッセージは、すべての受信側で受信されます。

  8. Cleanup.bat を実行して、このサンプルにより作成された証明書を削除します。

Footer image

Copyright © 2007 by Microsoft Corporation.All rights reserved.