Share via


カスタム セキュア メタデータ エンドポイント

Download sample

このサンプルでは、既定のバインドではないバインドが使用されているメタデータのエンドポイントが含まれるサービスを実装する方法と、ServiceModel Metadata Utility Tool (Svcutil.exe) またはクライアントを構成して、そのようなメタデータのエンドポイントからメタデータを取得する方法を示します。

Noteメモ :

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

サービス

このサンプルのサービスには 2 つのエンドポイントがあります。アプリケーション エンドポイントは、ReliableSession が有効で証明書による Message セキュリティを使用する WSHttpBinding に、ICalculator コントラクトを提供します。メタデータ エンドポイントでも、同じセキュリティが設定されている WSHttpBinding を使用しますが、ReliableSession は無効です。関連する構成は次のとおりです。

<services>
    …
    <service name="Microsoft.ServiceModel.Samples.CalculatorService"
            behaviorConfiguration="CalculatorServiceBehavior">
     <!-- use base address provided by host -->
     <endpoint address=""
       binding="wsHttpBinding"
       bindingConfiguration="Binding2"
       contract="Microsoft.ServiceModel.Samples.ICalculator" />
     <endpoint address="mex"
       binding="wsHttpBinding"
       bindingConfiguration="Binding1"
       contract="IMetadataExchange" />
     </service>
 </services>
 <bindings>
   <wsHttpBinding>
     <binding name="Binding1">
       <security mode="Message">
         <message clientCredentialType="Certificate" />
       </security>
     </binding>
     <binding name="Binding2">
       <reliableSession inactivityTimeout="00:01:00" enabled="true" />
       <security mode="Message">
         <message clientCredentialType="Certificate" />
       </security>
     </binding>
   </wsHttpBinding>
 </bindings>

他の多くのサンプルでは、メタデータ エンドポイントには、セキュリティ保護されていない既定の mexHttpBinding が使用されます。このサンプルのメタデータは、Message セキュリティが設定されている WSHttpBinding を使用してセキュリティ保護されます。メタデータ クライアントがこのメタデータを取得するには、照合バインディングを使用して構成する必要があります。このサンプルでは、こうした 2 つのクライアントを示します。

最初のクライアントでは Svcutil.exe を使用し、デザイン時にメタデータを取得してクライアント コードと構成を生成します。サービスはメタデータの既定以外のバインディングを使用するので、Svcutil.exe ツールはこのバインディングを使用してサービスからメタデータを取得できるよう、特に構成される必要があります。

2 番目のクライアントでは MetadataResolver を使用し、既知のコントラクトのメタデータを動的に取得して、動的に生成されたクライアントでの操作を呼び出します。

Svcutil クライアント

既定のバインディングを使用して IMetadataExchange エンドポイントをホストする場合、このエンドポイントのアドレスを使用して次のように Svcutil.exe を実行できます。

svcutil https://localhost/servicemodelsamples/service.svc/mex

これでツールが動作します。ただしこのサンプルのサーバーでは、メタデータをホストするときに既定以外のエンドポイントを使用しています。そのため、正しいバインディングが使用されるように Svcutil.exe を指定する必要があります。これは、Svcutil.exe.config ファイルを使用して実行できます。

Svcutil.exe.config ファイルは、通常のクライアント構成ファイルに似ています。異なる点は、次に示すようにクライアントのエンドポイント名とエンドポイント コントラクトだけです。

<endpoint name="http"
          binding="wsHttpBinding"
          bindingConfiguration="Binding1"
          behaviorConfiguration="ClientCertificateBehavior"
          contract="IMetadataExchange" />

エンドポイント名は、メタデータがホストされるアドレスのスキーマの名前である必要があります。また、エンドポイント コントラクトは IMetadataExchange であることが必要です。したがって、Svcutil.exe をコマンド ラインで実行する場合は次のようになります。

svcutil https://localhost/servicemodelsamples/service.svc/mex

ここでは、"http" という名前のエンドポイントと、このメタデータ エンドポイントとの通信交換のバインディングと動作を構成するコントラクト IMetadataExchange が検索されます。このサンプルでは、Svcutil.exe.config ファイルの残りの部分でバインディング構成と動作の資格情報を指定して、サーバーのメタデータ エンドポイントの構成と照合します。

Svcutil.exe が Svcutil.exe.config の構成を使用するには、Svcutil.exe がこの構成ファイルと同じディレクトリにある必要があります。したがって、Svcutil.exe をインストール場所から Svcutil.exe.config ファイルが含まれるディレクトリにコピーする必要があります。その後、そのディレクトリで次のコマンドを実行します。

.\svcutil.exe https://localhost/servicemodelsamples/service.svc/mex

先頭の ".\" により、現在のディレクトリ (対応する Svcutil.exe.config のあるディレクトリ) 内の Svcutil.exe のコピーが実行されることになります。

MetadataResolver クライアント

クライアントで、コントラクトおよびメタデータと対話する方法がデザイン時に認識されている場合、クライアントは MetadataResolver を使用してアプリケーション エンドポイントのバインディングとアドレスを動的に検索することができます。その例として、このクライアントのサンプルでは、MetadataExchangeClient を作成して構成することにより、MetadataResolver で使用されるバインディングと資格情報を構成する方法を示します。

Svcutil.exe.config には、同じバインディングと資格情報についての情報が示されており、MetadataExchangeClient でこれを次のように強制的に使用できます。

// Specify the Metadata Exchange binding and its security mode
WSHttpBinding mexBinding = new WSHttpBinding(SecurityMode.Message);
mexBinding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;

// Create a MetadataExchangeClient for retrieving metadata, and set the // certificate details
MetadataExchangeClient mexClient = new MetadataExchangeClient(mexBinding);
mexClient.SoapCredentials.ClientCertificate.SetCertificate(    StoreLocation.CurrentUser, StoreName.My,
    X509FindType.FindBySubjectName, "client.com");
mexClient.SoapCredentials.ServiceCertificate.Authentication.    CertificateValidationMode =    X509CertificateValidationMode.PeerOrChainTrust;
mexClient.SoapCredentials.ServiceCertificate.SetDefaultCertificate(    StoreLocation.CurrentUser, StoreName.TrustedPeople,
    X509FindType.FindBySubjectName, "localhost");

mexClient が構成されている場合、次のように必要なコントラクトを列挙し、MetadataResolver を使用してこれらのコントラクトが含まれるエンドポイントの一覧を取得できます。

// The contract we want to fetch metadata for
Collection<ContractDescription> contracts =    new Collection<ContractDescription>();
ContractDescription contract =    ContractDescription.GetContract(typeof(ICalculator));
contracts.Add(contract);
// Find endpoints for that contract
EndpointAddress mexAddress = new    EndpointAddress(ConfigurationManager.AppSettings["mexAddress"]);
ServiceEndpointCollection endpoints =    MetadataResolver.Resolve(contracts, mexAddress, mexClient);

最後に、こうしたエンドポイントからの情報を使用して、アプリケーション エンドポイントと通信するチャネルの作成に使用される、ChannelFactory のバインディングとアドレスを初期化できます。

ChannelFactory<ICalculator> cf = new    ChannelFactory<ICalculator>(endpoint.Binding, endpoint.Address);

このクライアント サンプルで重要な点は、MetadataResolver を使用しているときにメタデータ交換通信用のカスタム バインディングまたはカスタム動作を指定する必要がある場合に、MetadataExchangeClient を使用すればこうしたカスタム設定を指定できるということです。

サンプルをセットアップしてビルドするには

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

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

サンプルを同じコンピュータで実行するには

  1. Setup.bat をサンプルのインストール フォルダで実行します。これにより、サンプルの実行に必要なすべての証明書がインストールされます。Setup.bat は、「Windows Communication Foundation サンプルの 1 回限りのセットアップの手順」から setupCertTool.bat を実行してインストールされる FindPrivateKey.exe ツールを使用します。

  2. \MetadataResolverClient\bin または \SvcutilClient\bin でクライアント アプリケーションを実行します。クライアント アクティビティがクライアントのコンソール アプリケーションに表示されます。

  3. クライアントとサービス間で通信できない場合は、「トラブルシューティングのヒント」を参照してください。

  4. サンプルの使用が終わったら、Cleanup.bat を実行して証明書を削除してください。他のセキュリティ サンプルでも同じ証明書を使用します。

サンプルを別のコンピュータで実行するには

  1. サーバーで setup.bat service を実行します。setup.bat service 引数を指定して実行すると、コンピュータの完全修飾ドメイン名を使用してサービス証明書が作成され、Service.cer というファイルにエクスポートされます。

  2. サーバーで、Web.config を編集して新しい証明書の名前を反映します。つまり、<serviceCertificate> of <serviceCredentials> Element 要素の findValue 属性をコンピュータの完全修飾ドメイン名に変更します。

  3. Service.cer ファイルを、サービス ディレクトリからクライアント コンピュータのクライアント ディレクトリにコピーします。

  4. クライアントで setup.bat client を実行します。setup.bat client 引数を指定して実行すると、Client.com というクライアント証明書が作成され、Client.cer というファイルにエクスポートされます。

  5. クライアント コンピュータにある MetadataResolverClient の App.config ファイルで、MEX エンドポイントのアドレス値をサービスの新しいアドレスに合わせて変更します。そのためには、localhost をサーバーの完全修飾ドメイン名に置き換えます。さらに、metadataResolverClient.cs ファイルに記述されている "localhost" を、新しいサービス証明書の名前 (サーバーの完全修飾ドメイン名) に変更します。SvcutilClient プロジェクトの App.config に対して、同様の手順を行います。

  6. Client.cer ファイルを、クライアント ディレクトリからサーバーのサービス ディレクトリにコピーします。

  7. クライアントで ImportServiceCert.bat を実行します。これにより、サービス証明書が Service.cer ファイルから CurrentUser - TrustedPeople ストアにコピーされます。

  8. サーバーで ImportClientCert.bat を実行します。これにより、クライアント証明書が Client.cer ファイルから LocalMachine - TrustedPeople ストアにインポートされます。

  9. サービス コンピュータで、Visual Studio でサービス プロジェクトをビルドし、それが実行されていることを Web ブラウザでヘルプ ページを選択することにより検証します。

  10. クライアント コンピュータ上の VS で、MetadataResolverClient または SvcutilClient を実行します。

    1. クライアントとサービス間で通信できない場合は、「トラブルシューティングのヒント」を参照してください。

サンプルの実行後にクリーンアップするには

  • サンプルの実行が終わったら、サンプル フォルダにある Cleanup.bat を実行します。

    Noteメモ :

    このサンプルを別のマシンで実行している場合、このスクリプトはサービス証明書をクライアントから削除しません。別のコンピュータで証明書を使用する Windows Communication Foundation (WCF) サンプルを実行した場合は、CurrentUser - TrustedPeople ストアにインストールされたサービス証明書を忘れずに削除してください。削除するには、コマンド certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> を実行します。たとえば、certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com のように指定します。

Footer image

Copyright © 2007 by Microsoft Corporation.All rights reserved.