方法: セキュリティで保護されたセッションに対しセキュリティ コンテキスト トークンを作成するHow to: Create a Security Context Token for a Secure Session

セキュリティで保護されたセッションでステートフルなセキュリティ コンテキスト トークン (SCT: Security Context Token) を使用すると、そのセッションでサービスを再利用できます。By using a stateful security context token (SCT) in a secure session, the session can withstand the service being recycled. たとえば、セキュリティで保護されたセッションでステートレスな SCT を使用しているときにインターネット インフォメーション サービス (IIS) をリセットすると、サービスに関連付けられているセッション データが失われます。For instance, when a stateless SCT is used in a secure session and Internet Information Services (IIS) is reset, then the session data that is associated with the service is lost. このセッション データには、SCT キャッシュが含まれています。This session data includes an SCT token cache. このため、クライアントが次回ステートレスな SCT をサービスに送信すると、エラーが返されます。これは、SCT に関連付けられているキーを取得できないためです。So, the next time a client sends the service a stateless SCT, an error is returned, because the key that is associated with the SCT cannot be retrieved. しかし、ステートフルな SCT を使用した場合、SCT に関連付けられているキーは、その SCT 内に格納されます。If, however, a stateful SCT is used, then the key that is associated with the SCT is contained within the SCT. キーが SCT 内、つまりメッセージ内に格納されているため、セキュリティで保護されたセッションは、サービスの再使用の影響を受けません。Because the key is contained within the SCT and thus contained within the message, the secure session is not affected by the service being recycled. 既定では、Windows Communication Foundation (WCF) は、セキュリティで保護されたセッションでステートレスな SCTs を使用します。By default, Windows Communication Foundation (WCF) uses stateless SCTs in a secure session. ここでは、セキュリティで保護されたセッションでステートフルな SCT を使用する方法について詳しく説明します。This topic details how to use stateful SCTs in a secure session.

注意

IDuplexChannel から派生したコントラクトに関係する、セキュリティで保護されたセッションでは、ステートフルな SCT を使用できません。Stateful SCTs cannot be used in a secure session that involves a contract that derives from IDuplexChannel.

注意

セキュリティで保護されたセッションでステートフルな SCT を使用するアプリケーションでは、サービスのスレッド ID は、関連付けられたユーザー プロファイルを持つユーザー アカウントである必要があります。For applications that use stateful SCTs in a secure session, the thread identity for the service must be a user account that has an associated user profile. ユーザー プロファイルを持たないアカウント (Local Service など) でサービスを実行すると、例外がスローされる場合があります。When the service is run under an account that does not have a user profile, such as Local Service, an exception may be thrown.

注意

Windows XP で偽装が必要な場合は、ステートフルな SCT を使用しない、セキュリティで保護されたセッションを使用します。When impersonation is required on Windows XP, use a secure session without a stateful SCT. ステートフルな SCT が偽装と共に使用されると、InvalidOperationException がスローされます。When stateful SCTs are used with impersonation, an InvalidOperationException is thrown. 詳細については、「サポートされないシナリオ」を参照してください。For more information, see Unsupported Scenarios.

セキュリティで保護されたセッションでステートフルな SCT を使用するにはTo use stateful SCTs in a secure session

  • ステートフルな SCT を使用する、セキュリティで保護されたセッションによって SOAP メッセージを保護するように指定するカスタム バインドを作成します。Create a custom binding that specifies that SOAP messages are protected by a secure session that uses a stateful SCT.

    1. サービスの構成ファイルに <customBinding >を追加することによって、カスタムバインディングを定義します。Define a custom binding, by adding a <customBinding> to the configuration file for the service.

      <customBinding>  
      
    2. > 子要素のバインドをcustomBinding>に追加します。< <Add a <binding> child element to the <customBinding>.

      name 属性を、構成ファイル内で一意の名前に設定してバンディング名を指定します。Specify a binding name by setting the name attribute to a unique name within the configuration file.

      <binding name="StatefulSCTSecureSession">  
      
    3. セキュリティ > の < 子要素をcustomBinding>に追加して、このサービスとの間で送受信されるメッセージの<認証モードを指定します。Specify the authentication mode for messages sent to and from this service by adding a <security> child element to the <customBinding>.

      authenticationMode 属性を SecureConversation に設定して、セキュリティで保護されたセッションを指定します。Specify that a secure session is used by setting the authenticationMode attribute to SecureConversation. requireSecurityContextCancellation 属性を false に設定して、ステートフルな SCT を使用するように指定します。Specify that stateful SCTs are used by setting the requireSecurityContextCancellation attribute to false.

      <security authenticationMode="SecureConversation"  
                requireSecurityContextCancellation="false">  
      
    4. セキュリティ > に <secureConversationBootstrap >子要素を追加することによって、セキュリティで保護されたセッションの確立中にクライアントが認証される方法を指定します。 <Specify how the client is authenticated while the secure session is established by adding a <secureConversationBootstrap> child element to the <security>.

      クライアントの認証方法は、authenticationMode 属性を設定して指定します。Specify how the client is authenticated by setting the authenticationMode attribute.

      <secureConversationBootstrap authenticationMode="UserNameForCertificate" />  
      
    5. Textmessageencoding > などのエンコーディング要素を <追加して、メッセージのエンコーディングを指定します。Specify the message encoding by adding an encoding element, such as <textMessageEncoding>.

      <textMessageEncoding />  
      
    6. <Httptransport >などのトランスポート要素を追加してトランスポートを指定します。Specify the transport by adding a transport element, such as the <httpTransport>.

      <httpTransport />  
      

    次のコード例では、構成を使用して、セキュリティで保護されたセッションでメッセージがステートフルな SCT と共に使用できるカスタム バインドを指定します。The following code example uses configuration to specify a custom binding that messages can use with stateful SCTs in a secure session.

    <customBinding>  
      <binding name="StatefulSCTSecureSession">  
        <security authenticationMode="SecureConversation"  
                  requireSecurityContextCancellation="false">  
          <secureConversationBootstrap authenticationMode="UserNameForCertificate" />  
        </security>  
        <textMessageEncoding />  
        <httpTransport />  
      </binding>  
    </customBinding>  
    

Example

セキュリティで保護されたセッションをブートストラップするための MutualCertificate 認証モードを使用する、カスタム バインドを作成するコード例を次に示します。The following code example creates a custom binding that uses the MutualCertificate authentication mode to bootstrap a secure session.

SecurityBindingElement security = SecurityBindingElement.CreateMutualCertificateBindingElement();

// Use a secure session and specify that stateful SecurityContextToken security tokens are used.
security = SecurityBindingElement.CreateSecureConversationBindingElement(security, false);

// Specify whether derived keys are needed.      
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("http://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();
Dim security As SecurityBindingElement = SecurityBindingElement.CreateMutualCertificateBindingElement()


' Use a secure session and specify that stateful SecurityContextToken security tokens are used.
security = SecurityBindingElement.CreateSecureConversationBindingElement(security, False)

' Specify whether derived keys are needed.      
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("http://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()

Windows 認証をステートフルな SCT と組み合わせて使用する場合、WCF は、 WindowsIdentityプロパティに実際の呼び出し元の id を設定しません。代わりに、プロパティを anonymous に設定します。When Windows authentication is used in combination with a stateful SCT, WCF does not populate the WindowsIdentity property with the actual caller's identity but instead sets the property to anonymous. WCF セキュリティでは、受信した SCT からのすべての要求に対してサービスセキュリティコンテキストの内容を再作成する必要があるため、サーバーはメモリ内のセキュリティセッションを追跡しません。Because WCF security must re-create the content of the service security context for every request from the incoming SCT, the server does not keep track of the security session in the memory. また、WindowsIdentity インスタンスは SCT にシリアル化できないため、WindowsIdentity プロパティは匿名 ID を返します。Because it is impossible to serialize the WindowsIdentity instance into the SCT, the WindowsIdentity property returns an anonymous identity.

次の構成は、この動作を示します。The following configuration exhibits this behavior.

<customBinding>  
  <binding name="Cancellation">  
       <textMessageEncoding />  
        <security   
            requireSecurityContextCancellation="false">  
              <secureConversationBootstrap />  
      </security>  
    <httpTransport />  
  </binding>  
</customBinding>  

関連項目See also