方法 : セキュリティで保護されたセッションを作成する
メッセージ セキュリティを有効にすると、basicHttpBinding Element バインディングを除き、システム提供のバインディング Windows Communication Foundation (WCF) では、セキュリティで保護されたセッションが自動的に使用されます。
既定では、セキュリティで保護されたセッションは、再利用される Web サーバーで存続します。セキュリティで保護されたセッションが確立されると、クライアントとサービスが、セキュリティで保護されたセッションに関連付けられているキーをキャッシュします。メッセージを交換するときは、キャッシュされたキーの識別子のみが交換されます。Web サーバーが再利用される場合は、Web サーバーが識別子のキャッシュされたキーを取得できないようにキャッシュも再利用されます。これが発生した場合、例外がクライアントにスローされます。ステートフルなセキュリティ コンテキスト トークン (SCT: Security Context Token) を使用するセキュリティで保護されたセッションは、再利用される Web サーバーで存続することができます。セキュリティで保護されたセッションでステートフルな SCT を使用する方法詳細情報、「方法 : セキュリティで保護されたセッションに対しセキュリティ コンテキスト トークンを作成する」を参照してください。
サービスが、システム提供のバインディングの 1 つを使用して、セキュリティで保護されたセッションを使用するように指定するには
メッセージ セキュリティをサポートするシステム提供のバインディングを使用するようにサービスを構成します。
basicHttpBinding Element バインディングを除き、システム提供のバインディングでメッセージ セキュリティが使用されるように設定しておくと、WCF ではセキュリティで保護されたセッションが自動的に使用されます。次の表は、メッセージ セキュリティをサポートするシステム提供のバインディングを示し、そのバインディングでメッセージ セキュリティが既定のセキュリティ機構であるかどうかを示しています。
システム提供のバインディング 構成要素 既定でメッセージ セキュリティが有効 ×
○
○
○
×
×
次のコード例に使用されている構成では、wsHttpBinding Element、メッセージ セキュリティ、およびセキュリティで保護されたセッションを使用する
wsHttpBinding_Calculator
という名前のバインディングを指定しています。<bindings> <WSHttpBinding> <binding name = "wsHttpBinding_Calculator"> <security mode="Message"> <message clientCredentialType="Windows"/> </security> </binding> </WSHttpBinding> </bindings>
wsHttpBinding Element、メッセージ セキュリティ、およびセキュリティで保護されたセッションを使用して、
secureCalculator
サービスをセキュリティで保護するように指定するコード例を次に示します。Dim myBinding As New WSHttpBinding() myBinding.Security.Mode = SecurityMode.Message myBinding.Security.Message.ClientCredentialType = MessageCredentialType.Windows ' 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()
WSHttpBinding myBinding = new WSHttpBinding(); myBinding.Security.Mode = SecurityMode.Message; myBinding.Security.Message.ClientCredentialType = MessageCredentialType.Windows; // 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/serviceModelSamples/"); // Create the ServiceHost and add an endpoint, then start // the service. ServiceHost myServiceHost = new ServiceHost(serviceType, baseAddress); myServiceHost.AddServiceEndpoint (contractType, myBinding, "secureCalculator"); myServiceHost.Open();
注 : wsHttpBinding Element については、establishSecurityContext 属性を false に設定してセキュリティで保護されたセッションを無効にできます。他のシステム提供のバインディングについては、カスタム バインディングを作成することでのみ、セキュリティで保護されたセッションを無効にできます。
カスタム バインディングを使用して、サービスでセキュリティで保護されたセッションが使用されるように指定するには
セキュリティで保護されたセッションで SOAP メッセージが保護されるように指定したカスタム バインディングを作成します。
カスタム バインディングの作成詳細情報、「方法 : システム指定のバインディングをカスタマイズする」を参照してください。
次のコード例で使用されている構成では、セキュリティで保護されたセッションを使用して SOAP メッセージを保護するカスタム バインディングを指定しています。
<bindings> <!-- configure a custom binding --> <customBinding> <binding name="customBinding_Calculator"> <security authenticationMode="SecureConversation" /> <secureConversationBootstrap authenticationMode="SspiNegotiated" /> <textMessageEncoding messageVersion="Soap12WSAddressing10" writeEncoding="utf-8"/> <httpTransport/> </binding> </customBinding> </bindings>
セキュリティで保護されたセッションをブートストラップするための MutualCertificate 認証モードを使用する、カスタム バインディングを作成するコード例を次に示します。
Dim security As SecurityBindingElement = SecurityBindingElement.CreateMutualCertificateBindingElement() ' Use a secure session. security = SecurityBindingElement.CreateSecureConversationBindingElement(security, True) ' Specify whether derived keys are required. security.SetKeyDerivation(True) ' Create the custom binding. Dim myBinding As New CustomBinding(security, New HttpTransportBindingElement()) ' 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()
SecurityBindingElement security = SecurityBindingElement.CreateMutualCertificateBindingElement(); // Use a secure session. security = SecurityBindingElement.CreateSecureConversationBindingElement(security, true); // Specify whether derived keys are required. security.SetKeyDerivation(true); // Create the custom binding. CustomBinding myBinding = new CustomBinding(security, new HttpTransportBindingElement()); // 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/serviceModelSamples/"); // Create the ServiceHost and add an endpoint, then start // the service. ServiceHost myServiceHost = new ServiceHost(serviceType, baseAddress); myServiceHost.AddServiceEndpoint (contractType, myBinding, "secureCalculator"); myServiceHost.Open();