Cómo: 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 obtener más información, vea 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.
Defina un enlace personalizado, agregando customBinding Element al archivo de configuración para el servicio.
<customBinding>
Agregue un elemento secundario <binding>customBinding Element al.
Especifique un nombre de enlace estableciendo el atributo name en un nombre único dentro del archivo de configuración.
<binding name="StatefulSCTSecureSession">
Especifique el modo de autenticación para los mensajes enviados a y de este servicio agregando un elemento secundario security element of customBinding al customBinding Element.
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">
Especifique cómo se autentica el cliente mientras se establece la sesión segura agregando un elemento secundario secureConversationBootstrap element al security element of customBinding.
Especifique cómo se autentica el cliente estableciendo el atributo authenticationMode.
<secureConversationBootstrap authenticationMode="UserNameForCertificate" />
Especifique la codificación de mensajes agregando un elemento de codificación, como textMessageEncoding element.
<textMessageEncoding />
Especifique el transporte agregando un elemento de transporte, como httpTransport element.
<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.
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("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 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("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();
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 llamador 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 de servicio para cada solicitud del SCT de entrada, el servidor no mantiene un 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>