Como: criar uma sessão segura

Com exceção da associação <basicHttpBinding>, as associações fornecidas pelo sistema no WCF (Windows Communication Foundation) usam automaticamente sessões seguras quando a segurança da mensagem está habilitada.

Por padrão, as sessões seguras não sobrevivem a um servidor Web que é reciclado. Quando uma sessão segura é estabelecida, o cliente e o serviço armazenam em cache a chave associada à sessão segura. À medida que as mensagens são trocadas, apenas um identificador para a chave armazenada em cache é trocado. Se o servidor Web for reciclado, o cache também será reciclado, de modo que o servidor Web não possa recuperar a chave armazenada em cache para o identificador. Se isso acontecer, uma exceção será gerada novamente para o cliente. As sessões seguras que usam um SCT (token de contexto de segurança) com estado podem sobreviver a um servidor Web que está sendo reciclado. Para obter mais informações sobre como usar um SCT com estado em uma sessão segura, confira Como criar um token de contexto de segurança para uma sessão segura.

Para especificar que um serviço usa sessões seguras usando uma das associações fornecidas pelo sistema

  • Configure um serviço para usar uma associação fornecida pelo sistema que dê suporte à segurança da mensagem.

    Com exceção da associação <basicHttpBinding>, quando as associações fornecidas pelo sistema são configuradas para usar a segurança da mensagem, o WCF usa as sessões seguras automaticamente. A tabela a seguir lista as associações fornecidas pelo sistema que dão suporte à segurança da mensagem e se a segurança da mensagem é o mecanismo de segurança padrão.

    Associação fornecida pelo sistema Elemento de configuração Segurança da mensagem ativada por padrão
    BasicHttpBinding <basicHttpBinding> No
    WSHttpBinding <wsHttpBinding> Sim
    WSDualHttpBinding <wsDualHttpBinding> Sim
    WSFederationHttpBinding <wsFederationHttpBinding> Sim
    NetTcpBinding <netTcpBinding> No
    NetMsmqBinding <netMsmqBinding> No

    O exemplo de código a seguir usa a configuração para especificar uma associação chamada wsHttpBinding_Calculator que usa a <wsHttpBinding>, a segurança da mensagem e as sessões seguras.

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

    O exemplo de código a seguir especifica que a <wsHttpBinding>, a segurança da mensagem e as sessões seguras são usadas para proteger o serviço secureCalculator.

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

    Observação

    As sessões seguras podem ser desativadas para a <wsHttpBinding> pela definição do atributo establishSecurityContext como false. Para as outras associações fornecidas pelo sistema, as sessões seguras só podem ser desativadas com a criação de uma associação personalizada.

Para especificar que um serviço usa sessões seguras usando uma associação personalizada

  • Crie uma associação personalizada que especifica que as mensagens SOAP são protegidas por uma sessão segura.

    Para obter mais informações sobre como criar uma associação personalizada, confira Como personalizar uma associação fornecida pelo sistema.

    O exemplo de código a seguir usa a configuração para especificar uma associação personalizada que enviam mensagens usando uma sessão 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>  
    

    O exemplo de código a seguir cria uma associação personalizada que usa o modo de autenticação MutualCertificate para inicializar uma sessão segura.

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

Confira também