Compartir a través de


Cómo: Crear una sesión segura

Con la excepción del enlace basicHttpBinding Element, los enlaces proporcionados por el sistema en Windows Communication Foundation (WCF) utilizan automáticamente sesiones seguras cuando está habilitada la seguridad del mensaje.

De forma predeterminada, las sesiones seguras no permanecen en ningún servidor reciclado. Cuando se establece una sesión segura, el cliente y el servicio almacenan en memoria caché la clave asociada a la sesión segura. Cuando se intercambian los mensajes, se intercambia solo un identificador de la clave almacenada en memoria caché. Si se recicla el servidor web, también se recicla la memoria en caché, de manera que el servidor web no puede recuperar la clave almacenada en memoria caché para el identificador. Si ocurre esto, se produce una excepción que se devuelve al cliente. Las sesiones seguras que utilizan un token de contexto de seguridad con estado (SCT) pueden permanecer en un servidor web que se está reciclando. Para obtener más información sobre utilizar un SCT con estado en una sesión segura, consulte Cómo: Crear un token de contexto de seguridad para una sesión segura.

Para especificar que un servicio utiliza las sesiones seguras utilizando uno de los enlaces proporcionados por el sistema

  • Configure un servicio para utilizar un enlace proporcionado por el sistema que admite seguridad de mensaje.

    Con la excepción del enlace basicHttpBinding Element, cuando se configuran los enlaces proporcionados por el sistema para utilizar seguridad de mensaje, WCF utiliza automáticamente las sesiones seguras. La siguiente tabla detalla los enlaces proporcionados por el sistema que admiten seguridad de mensaje y si la seguridad de mensaje es el mecanismo de seguridad predeterminado.

    Enlace proporcionado por el sistema Elemento de configuración Seguridad de mensajes activada de forma predeterminada

    BasicHttpBinding

    basicHttpBinding Element

    No

    WSHttpBinding

    wsHttpBinding Element

    WSDualHttpBinding

    wsDualHttpBinding Element

    WSFederationHttpBinding

    wsFederationHttpBinding element

    NetTcpBinding

    netTcpBinding Element

    No

    NetMsmqBinding

    netMsmqBinding Element

    No

    El ejemplo de código siguiente utiliza la configuración para especificar un enlace denominado wsHttpBinding_Calculator que utiliza wsHttpBinding Element, la seguridad de mensajes y las sesiones seguras.

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

    El ejemplo de código siguiente especifica que wsHttpBinding Element, seguridad de mensaje y sesiones seguras se utilizan para proteger el servicio 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();
    
    ms733783.note(es-es,VS.100).gifNota:
    Las sesiones seguras pueden desactivarse para wsHttpBinding Element estableciendo el atributo establishSecurityContext en false. Para los otros enlaces proporcionados por el sistema, las sesiones seguras pueden desactivarse solo mediante la creación un enlace personalizado.

Especificar que un servicio utiliza sesiones seguras utilizando un enlace personalizado

  • Cree un enlace personalizado que especifica que una sesión segura protege los mensajes SOAP.

    Para obtener más información sobre crear un enlace personalizado, consulte Personalización de un enlace proporcionado por el sistema.

    El ejemplo de código siguiente utiliza la configuración para especificar un enlace personalizado que envía mensajes utilizando una sesión segura.

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

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

Vea también

Conceptos

Información general de enlaces de Windows Communication Foundation