Procedimiento para crear un token de contexto de seguridad para una sesión segura

Mediante el uso de un token de contexto de seguridad con estado (SCT) en una sesión segura, la sesión puede soportar que el servicio se recicle. Por ejemplo, cuando un SCT sin estado se utiliza en una sesión segura y se restablece Internet Information Services (IIS), a continuación, se pierden los datos de la sesión que están asociados al servicio. Estos datos de la sesión incluyen una caché de token de SCT. Así, la próxima vez que un cliente envíe un SCT sin estado al servicio, se devuelve un error, porque no se puede recuperar la clave que está asociada a SCT. Si, sin embargo, se utiliza un SCT con estado, la clave que está asociada a SCT se contiene dentro de SCT. Dado que la clave se contiene dentro de SCT y, por tanto, dentro del mensaje, el reciclaje del servicio no afecta a la sesión segura. De forma predeterminada, Windows Communication Foundation (WCF) utiliza SCT sin estado en una sesión segura. En este tema se detalla cómo utilizar SCT con estado en una sesión segura.

Nota

Los SCT con estado no se puede utilizar en una sesión segura que implique un contrato que derive de IDuplexChannel.

Nota

Para las aplicaciones que utilizan SCT con estado en una sesión segura, la identidad del subproceso para el servicio debe ser una cuenta de usuario que tenga un perfil de usuario asociado. Cuando el servicio se ejecuta bajo una cuenta que no tiene un perfil de usuario, como Local Service, se puede producir una excepción.

Nota

Cuando se requiere la suplantación en Windows XP, utilice una sesión segura sin un SCT con estado. Cuando se utilizan SCT con estado con suplantación, se produce una InvalidOperationException. Para más información, consulte, Escenarios no admitidos.

Para utilizar SCT con estado en una sesión segura

  • Cree un enlace personalizado que especifique que una sesión segura que utiliza un SCT con estado protege los mensajes SOAP.

    1. Defina un enlace personalizado, agregando <customBinding> al archivo de configuración del servicio.

      <customBinding>  
      </customBinding>
      
    2. Agregue un elemento secundario <binding> a <customBinding>.

      Especifique un nombre de enlace estableciendo el atributo name en un nombre único dentro del archivo de configuración.

      <binding name="StatefulSCTSecureSession">  
      </binding>
      
    3. Especifique el modo de autenticación para los mensajes enviados a este servicio y desde allí agregando un elemento secundario <security> a <customBinding>.

      Especifique que se utiliza una sesión segura estableciendo el atributo authenticationMode en SecureConversation. Especifique que se utilizan SCT con estado estableciendo el atributo requireSecurityContextCancellation en false.

      <security authenticationMode="SecureConversation"  
                requireSecurityContextCancellation="false">
      </security>
      
    4. Especifique cómo se autentica el cliente mientras se establece la sesión segura agregando un elemento secundario <secureConversationBootstrap> a <security>.

      Especifique cómo se autentica el cliente estableciendo el atributo authenticationMode.

      <secureConversationBootstrap authenticationMode="UserNameForCertificate" />  
      
    5. Especifique la codificación de mensajes agregando un elemento de codificación, como <textMessageEncoding>.

      <textMessageEncoding />  
      
    6. Especifique el transporte agregando un elemento de transporte, como <httpTransport>.

      <httpTransport />  
      

    El ejemplo de código siguiente utiliza la configuración para especificar un enlace personalizado que los mensajes puedan utilizar con SCT con estado en una sesión segura.

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

Ejemplo

El ejemplo de código siguiente crea un enlace personalizado que utiliza el modo de autenticación MutualCertificate para arrancar una sesión segura.

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()

Cuando la autenticación de Windows se utiliza en combinación con un SCT con estado, WCF no rellena la propiedad WindowsIdentity con la identidad del autor de la llamada real, sino que en su lugar establece la propiedad en anónimo. Dado que la seguridad de WCF debe recrear el contenido del contexto de seguridad del servicio de cada solicitud del SCT de entrada, el servidor no mantiene el seguimiento de la sesión de seguridad en la memoria. Dado que es imposible serializar la instancia de WindowsIdentity en SCT, la propiedad WindowsIdentity devuelve una identidad anónima.

La siguiente configuración exhibe este comportamiento.

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

Consulte también