次の方法で共有


方法 : Windows 資格情報でサービスをセキュリティで保護する

ここでは、Windows ドメイン内に存在し、同じドメインのクライアントから呼び出される Windows Communication Foundation (WCF) サービスで転送セキュリティを有効にする方法について説明します。このシナリオ詳細情報、「トランスポート セキュリティと Windows 認証」を参照してください。サンプル アプリケーションについては、「WSHttpBinding」のサンプルを参照してください。

このトピックでは、定義済みのコントラクト インターフェイスと実装が既に存在するものとして、それに機能を追加していきます。既存のサービスとクライアントを変更することもできます。

Windows 資格情報によるサービスのセキュリティ保護は、完全にコードで実現できます。または、構成ファイルを使用して、一部のコードを省略することもできます。このトピックでは両方の方法について説明します。ただし、どちらか 1 つの方法だけを使うようにして、両方は使用しないでください。

最初の 3 つの手順は、コードを使用してサービスをセキュリティで保護する方法について示しています。4 番目と 5 番目の手順は、構成ファイルを使用して同様の操作を行う方法について示しています。

コードの使用

サービスとクライアントの完全なコードは、このトピックの最後にある「使用例」のセクションに記載されています。

最初の手順では、コードで WSHttpBinding クラスを作成および構成する方法について説明します。バインディングでは HTTP トランスポートを使用します。同じバインディングがクライアント上で使用されます。

Windows 資格情報とメッセージ セキュリティを使用する WSHttpBinding を作成するには

  1. この手順のコードは、「使用例」のセクションに記載されたサービス コードの Test クラスの Run メソッドの先頭に挿入されています。

  2. WSHttpBinding クラスのインスタンスを作成します。

  3. WsHttpSecurity クラスの Mode プロパティを Message に設定します。

  4. MessageSecurityOverHttp クラスの ClientCredentialType プロパティを Windows に設定します。

  5. この手順で使用するコードは、次のようになります。

    Dim myBinding As New WSHttpBinding()
    myBinding.Security.Mode = SecurityMode.Message
    myBinding.Security.Message.ClientCredentialType = MessageCredentialType.Windows
    
    // First procedure:
    // create a WSHttpBinding that uses Windows credentials and message security
    WSHttpBinding myBinding = new WSHttpBinding();
    myBinding.Security.Mode = SecurityMode.Message;
    myBinding.Security.Message.ClientCredentialType =
        MessageCredentialType.Windows;
    

サービスでのバインディングの使用

この 2 番目の手順では、自己ホスト型サービスでバインディングを使用する方法を示します。サービスのホスト詳細情報、「ホスティング サービス」を参照してください。

サービスでバインディングを使用するには

  1. 前の手順のコードの後に、この手順のコードを挿入します。

  2. contractType という名前の Type 変数を作成し、その変数にインターフェイスの型 (ICalculator) を割り当てます。Visual Basic を使用している場合は、GetType 演算子を使用し、C# を使用している場合は、typeof キーワードを使用します。

  3. serviceType という名前の 2 つ目の Type 変数を作成し、その変数に実装されたコントラクトの型 (Calculator) を割り当てます。

  4. baseAddress という名前で、サービスのベース アドレスが指定された Uri クラスのインスタンスを作成します。ベース アドレスには、トランスポートに一致するスキームを指定する必要があります。この場合、トランスポート スキームは HTTP であり、アドレスは、特別な URI (Uniform Resource Identifier) の "localhost"、ポート番号 (8036)、およびベース エンドポイント アドレス ("serviceModelSamples/) で構成されます。つまり、https://localhost:8036/serviceModelSamples/ になります。

  5. serviceType 変数と baseAddress 変数を指定して、ServiceHost クラスのインスタンスを作成します。

  6. contractType、バインディング、およびエンドポイント名 (secureCalculator) を使用して、サービスにエンドポイントを追加します。クライアントは、サービスへの呼び出しを開始するときに、ベース アドレスとエンドポイント名を連結する必要があります。

  7. Open メソッドを呼び出してサービスを起動します。この手順で使用するコードは次のとおりです。

    ' Create the Type instances for later use and the URI for 
    ' the base address.
    Dim contractType As Type = GetType(ICalculator)
    Dim serviceType As Type = GetType(Calculator)
    Dim baseAddress As New Uri("https://localhost:8036/serviceModelSamples/")
    
    ' Create the ServiceHost and add an endpoint, then start
    ' the service.
    Dim myServiceHost As New ServiceHost(serviceType, baseAddress)
    myServiceHost.AddServiceEndpoint(contractType, myBinding, "secureCalculator")
    myServiceHost.Open()
    
    // 2nd Procedure:
    // Use the binding in a service
    // Create the Type instances for later use and the URI for 
    // the base address.
    Type contractType = typeof(ICalculator);
    Type serviceType = typeof(Calculator);
    Uri baseAddress = new
        Uri("https://localhost:8036/SecuritySamples/");
    
    // Create the ServiceHost and add an endpoint, then start
    // the service.
    ServiceHost myServiceHost =
        new ServiceHost(serviceType, baseAddress);
    myServiceHost.AddServiceEndpoint
        (contractType, myBinding, "secureCalculator");
    
    //enable metadata
    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
    smb.HttpGetEnabled = true;
    myServiceHost.Description.Behaviors.Add(smb);
    
    myServiceHost.Open();
    

クライアントでのバインディングの使用

この手順では、サービスと通信するプロキシの生成方法を示します。プロキシは、ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) によって生成されます。このツールは、サービス メタデータを使用してプロキシを作成します。

この手順では、サービスと通信するための WSHttpBinding クラスのインスタンスも作成され、サービスが呼び出されます。

この例では、コードだけを使用してクライアントを作成します。この手順の後のセクションに示す構成ファイルを使用することもできます。

コードによってクライアントでバインディングを使用するには

  1. SvcUtil.exe ツールを使用して、サービスのメタデータからプロキシ コードを生成します。詳細については、次のトピックを参照してください。、「方法 : Windows Communication Foundation クライアントを作成する」を参照してください。生成されたプロキシ コードは ClientBase クラスから継承しているので、各クライアントには、WCF サービスとの通信に必要なコンストラクター、メソッド、およびプロパティが確実に定義されます。この例では、生成されたコードに、ICalculator インターフェイスを実装した CalculatorClient クラスが追加されるので、サービス コードとの互換が可能になります。

  2. この手順のコードは、クライアント プログラムの Main メソッドの先頭に挿入します。

  3. WSHttpBinding クラスのインスタンスを作成し、そのセキュリティ モードを Message に、そのクライアント資格情報の種類を Windows に設定します。この例では、変数に clientBinding という名前を付けます。

  4. serviceAddress という名前の EndpointAddress クラスのインスタンスを作成します。エンドポイント名が連結されたベース アドレスでインスタンスを初期化します。

  5. serviceAddress 変数と clientBinding 変数を指定して、生成されたクライアント クラスのインスタンスを作成します。

  6. 次のコードに示すように、Open メソッドを呼び出します。

  7. サービスを呼び出し、結果を表示します。

    Dim b As New WSHttpBinding(SecurityMode.Message)
    b.Security.Message.ClientCredentialType = MessageCredentialType.Windows
    
    Dim ea As New EndpointAddress("net.tcp://machinename:8036/endpoint")
    Dim cc As New CalculatorClient(b, ea)
    cc.Open()
    
    ' Alternatively, use a binding name from a configuration file generated by the
    ' SvcUtil.exe tool to create the client. Omit the binding and endpoint address 
    ' because that information is provided by the configuration file.
    ' CalculatorClass cc = new CalculatorClient("ICalculator_Binding")
    
    // 3rd Procedure:
    //  Creating a binding and using it in a service
    
    // To run using config, comment the following lines, and uncomment out the code
    // following this section
    WSHttpBinding b = new WSHttpBinding(SecurityMode.Message);
    b.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
    
    EndpointAddress ea = new EndpointAddress("Http://localhost:8036/SecuritySamples/secureCalculator");
    CalculatorClient cc = new CalculatorClient(b, ea);
    cc.Open();
    
    // Now call the service and display the results
    // Call the Add service operation.
    double value1 = 100.00D;
    double value2 = 15.99D;
    double result = cc.Add(value1, value2);
    Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
    
    // Closing the client gracefully closes the connection and cleans up resources.
    cc.Close();
    

構成ファイルの使用

手順コードを使用してバインディングを作成する代わりに、構成ファイルのバインディング セクションに次のコードを記述することもできます。

まだサービスを定義していない場合は、「サービスの設計と実装」および「サービスの構成」を参照してください。

メモ   この構成コードは、サービス構成ファイルとクライアント構成ファイルの両方で使用します。

構成を使用して Windows ドメインのサービスで転送セキュリティを有効にするには

  1. 構成ファイルの <bindings> 要素のセクションに <wsHttpBinding> 要素を追加します。

  2. <WSHttpBinding> 要素に <binding> 要素を追加し、configurationName 属性をアプリケーションに適した値に設定します。

  3. <security> 要素を追加し、mode 属性を Message に設定します。

  4. <message> 要素を追加し、clientCredentialType 属性を Windows に設定します。

  5. サービスの構成ファイルで、<bindings> セクションを次のコードに置き換えます。サービス構成ファイルがない場合は、「サービスとクライアントを構成するためのバインディングの使用」を参照してください。

    <bindings>
      <wsHttpBinding>
       <binding name = "wsHttpBinding_Calculator">
         <security mode="Message">
           <message clientCredentialType="Windows"/>
         </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    

クライアントでのバインディングの使用

この手順では、サービスと通信するプロキシと構成ファイルの 2 つのファイルの生成方法を示します。また、クライアント上で使用される 3 つ目のファイルであるクライアント プログラムへの変更点についても説明します。

構成によってクライアントでバインディングを使用するには

  1. SvcUtil.exe ツールを使用して、サービスのメタデータからプロキシ コードと構成ファイルを生成します。詳細については、次のトピックを参照してください。、「方法 : Windows Communication Foundation クライアントを作成する」を参照してください。

  2. 生成された構成ファイルの <Bindings> セクションを、前のセクションの構成コードに置き換えます。

  3. 手順コードは、クライアント プログラムの Main メソッドの先頭に挿入します。

  4. 生成されたクライアント クラスのインスタンスを作成します。このとき、構成ファイルのバインディングの名前を入力パラメーターとして渡します。

  5. 次のコードに示すように、Open メソッドを呼び出します。

  6. サービスを呼び出し、結果を表示します。

    // 4th Procedure:
    //  Using config instead of the binding-related code
    // In this case, use a binding name from a configuration file generated by the
    // SvcUtil.exe tool to create the client. Omit the binding and endpoint address 
    // because that information is provided by the configuration file.
    
    CalculatorClient cc = new CalculatorClient("ICalculator_Binding");
    cc.Open();
    
    // Now call the service and display the results
    // Call the Add service operation.
    double value1 = 100.00D;
    double value2 = 15.99D;
    double result = cc.Add(value1, value2);
    Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
    
    // Closing the client gracefully closes the connection and cleans up resources.
    cc.Close();
    

using System;
using System.Collections;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Security.Permissions;

[assembly: SecurityPermission(SecurityAction.RequestMinimum, Execution = true)]
namespace Microsoft.Security.Samples
{
    public class Test
    {
        static void Main()
        {
            Test t = new Test();
            Console.WriteLine("Starting....");
            t.Run();

        }

        private void Run()
        {
            // First procedure:
            // create a WSHttpBinding that uses Windows credentials and message security
            WSHttpBinding myBinding = new WSHttpBinding();
            myBinding.Security.Mode = SecurityMode.Message;
            myBinding.Security.Message.ClientCredentialType =
                MessageCredentialType.Windows;

            // 2nd Procedure:
            // Use the binding in a service
            // Create the Type instances for later use and the URI for 
            // the base address.
            Type contractType = typeof(ICalculator);
            Type serviceType = typeof(Calculator);
            Uri baseAddress = new
                Uri("https://localhost:8036/SecuritySamples/");

            // Create the ServiceHost and add an endpoint, then start
            // the service.
            ServiceHost myServiceHost =
                new ServiceHost(serviceType, baseAddress);
            myServiceHost.AddServiceEndpoint
                (contractType, myBinding, "secureCalculator");

            //enable metadata
            ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
            smb.HttpGetEnabled = true;
            myServiceHost.Description.Behaviors.Add(smb);

            myServiceHost.Open();
            Console.WriteLine("Listening");
            Console.WriteLine("Press Enter to close the service");
            Console.ReadLine();
            myServiceHost.Close();
        }
    }

    [ServiceContract]
    public interface ICalculator
    {
        [OperationContract]
        double Add(double a, double b);
    }

    public class Calculator : ICalculator
    {
        public double Add(double a, double b)
        {
            return a + b;
        }
    }
}

参照

処理手順

方法 : Windows Communication Foundation クライアントを作成する

リファレンス

WSHttpBinding

概念

ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe)
サービスのセキュリティ保護
セキュリティの概要