Share via


ピア チャネル カスタム認証

Download sample

このサンプルでは、アプリケーションで提供されるピア認証を使用してマルチパーティ通信を実現する、NetPeerTcpBinding バインディングをカスタム認証モードで使用する方法を示します。このサンプルは、「入門サンプル」の変化形です。Windows Communication Foundation (WCF) の概要については、「入門サンプル」を参照してください。

このサンプルでは、すべてのインスタンスは自己ホスト型コンソール アプリケーションです。クライアントおよびサーバーの概念はありません。

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

Noteメモ :

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

PeerChannel とは、WCF のマルチパーティ対応ピアツーピア (P2P) 通信技術です。これにより、安全で、拡張可能な、信頼できるメッセージ機能が実現されます。ピア チャネルのメリットを活用するマルチパーティ アプリケーションの一般的な例は、チャットなどの共同作業アプリケーションです。チャットでは、ユーザーのグループがサーバーを必要としないピアツーピア方式で互いに会話します。ピア チャネルを使用することで、P2P コラボレーション、コンテンツ配布、負荷分散、および分散処理を軸とする顧客シナリオや企業シナリオが実現されます。

ピア チャネルでは、次の新しい概念が導入されています。

  • メッシュは、互いに通信可能で、一意のメッシュ ID により識別されるピア ノードの名前付きコレクション (相関グラフ) です。

    Noteメモ :

    メッシュ内のアクティブ ノードは、メッシュ名を公開して、他のノードが検索できるようにします。メッシュには次の特徴があります。まず、ノードがメッシュに参加したりメッシュから離脱したりした場合に、メッシュは自動的に対応します。これにより、メッシュとすべてのノードとの良好な接続が維持されると共に、現在のトラフィック パターンに基づいて接続が動的に最適化されます。

  • ピア ノード」とは、メッシュ内のエンドポイントのことです。アプリケーションは、複数のピア ノードを使用して、異なるメッシュに参加できます。

  • ピア リゾルバ」は、メッシュ ID をメッシュ内のノードのエンドポイント アドレスに解決します。ピア ノードはこのアドレスを使用してメッシュ内の別のノードに接続します。これにより、メッセージがメッシュ内で伝達されるようになります。

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

PeerChannel は、PeerTransportCredentialType クラスで次の認証モードをサポートします。

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

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

バインディングは、クライアントの構成ファイルに指定されます。バインディングの種類は、エンドポイント要素の binding 属性に指定します。次のサンプル構成を参照してください。

<client>
  <!-- chat instance participating in the mesh -->
  <endpoint name="ChatEndpoint"
            address="net.p2p://SecurechatMesh/servicemodelsamples/chat"
            binding="netPeerTcpBinding"
            bindingConfiguration="MyBinding"
            contract="Microsoft.ServiceModel.Samples.IChat">
  </endpoint>
</client>

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

Noteメモ :

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

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

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

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

現時点では、ピア チャネルは ServiceModel Metadata Utility Tool (Svcutil.exe) と統合されていません。

サンプルを実行すると、クライアントでは、メッセージを送信する準備ができたことを示すメッセージが表示されます。1 つのクライアントから送信されたメッセージは、同じメッシュに参加している他のすべてのクライアントのコンソール ウィンドウに表示されます。クライアントを終了するには、クライアントのコンソール ウィンドウで Q キーを押してから 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 を実行し、証明書の発行元証明機関と 2 つのクライアント証明書を作成します。発行元証明機関の既定の名前は "TrustedPeerChannelIssuer" で、クライアント証明書の既定の名前は "peer1" および "peer2" です。名前は、Setup.bat に引数を渡して指定することもできます。たとえば、"setup.bat <peername> <issuername>" と指定できます。ここで、<peername> はクライアントのプレフィックス名、<issuername> はサンプルの信頼できる発行元の名前を表します。たとえば「setup.bat peer fake_issuer」と入力した場合、「fake_issuer」という信頼できる発行元と、「peer1」と「peer2」という名前のクライアント証明書が作成されます。単一のコンピュータでサンプルのすべてのインスタンスを実行する場合は、引き続き手順 7. を実行してください。

  7. 複数のコンピュータでセットアップを行うための追加手順 : 異なるコンピュータでサンプルを実行するには、1 つのコンピュータ上にある証明書の情報を、サンプルを実行する他のすべてのコンピュータにコピーして、すべてのピアで同じ発行元情報を持つようにする必要があります。これを行うには、信頼できる発行元を使用して作成されたクライアント証明書 (Setup.bat で生成) をエクスポートします。さらに、信頼できる発行元 (既定の名前を使用している場合は TrustedPeerChannelIssuer.cer) も、このサンプルを実行する他のすべてのクライアントにコピーします。次の 3 つの手順を実行します。

    1. 信頼できる発行元の転送 : .cer ファイル (Setup.bat を実行すると、これと同じフォルダに生成) をクライアント コンピュータにコピーします。このファイルを右クリックし、[証明書のインストール] をクリックします。[次へ] をクリックし、[証明書をすべて次のストアに配置する] をクリックします。[参照] をクリックし、証明書の配置先として [信頼されたユーザー] を選択します。[次へ][完了] の順にクリックして、証明書のインポートを完了します。

    2. クライアント証明書のエクスポート : クライアント証明書の生成に使用したコンピュータで、Certmgr.msc を実行することによって開始します。個人ストアのクライアント証明書を選択します ([証明書 - 現在のユーザー]、[個人] フォルダ、[証明書] フォルダの順に開きます)。この証明書を右クリックして [すべてのタスク]、[エクスポート] の順にクリックし、証明書のエクスポート ウィザードを開始します。[次へ] をクリックして [はい、秘密キーをエクスポートします] をクリックし、[次へ] をクリックします。再度 [次へ] をクリックして .pfx 形式のファイルと既定値を選択します。証明書のパスワードを入力し、再度 [次へ] をクリックします。最後にパスとファイル名を選択して [次へ]、[完了] の順にクリックし、エクスポート処理を完了します。

    3. クライアント証明書のインポート : 手順 (b) で作成した .PFX ファイルを、クライアント コンピュータにコピーします。ファイルを右クリックし、[PFX のインストール] をクリックします。次に [次へ] を 2 回クリックして、この証明書のエクスポートに使用されるパスワードを入力します。[次へ]、[完了] の順にクリックして、この証明書を個人ストアに配置します。

      Noteメモ :

      信頼できる発行元を作成し、ファイル転送を使用してエクスポートする場合、配布方法が適切でないと特定のセキュリティ リスクが生じる可能性があります。このサンプルの実行後は、サンプル証明書を忘れずに削除してください (手順 8.)。

  8. アプリケーションのインスタンスを必要な数だけ実行します。1 つのインスタンスから送信されたメッセージは、他のインスタンスで受信されます。各インスタンスの既定の名前は "peer1" です。特定の複数のインスタンスを区別するには、アプリケーションの構成ファイルにある appSettings で、"member" キーの値を変更し、同じ名前のクライアント証明書を作成します。

  9. 最後に、Cleanup.bat を実行して、このサンプルにより作成された証明書を削除します。既定以外の名前を使用した場合は、手順 6. で使用した値と同じ値を設定して、"Cleanup.bat <peername> <issuername>" を実行します。

Footer image

Copyright © 2007 by Microsoft Corporation.All rights reserved.