Partilhar via


Como: Criar uma sessão segura

Com exceção da ligação basicHttpBinding>, as associações fornecidas pelo sistema no Windows Communication Foundation (WCF) 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 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á devolvida ao cliente. As sessões seguras que usam um SCT (token de contexto de segurança) stateful podem sobreviver a um servidor Web que está sendo reciclado. Para obter mais informações sobre como usar um SCT com monitoração de estado em uma sessão segura, consulte 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 ofereça suporte à segurança de mensagens.

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

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

    O exemplo de código a seguir usa a configuração para especificar uma associação chamada wsHttpBinding_Calculator que usa wsHttpBinding>, segurança de <mensagem e 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 o wsHttpBinding, segurança de <mensagem e sessões seguras são usados para proteger o secureCalculator serviço.>

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

    Nota

    As sessões seguras podem ser desativadas para o <wsHttpBinding> definindo o establishSecurityContext atributo como false. Para as outras associações fornecidas pelo sistema, as sessões seguras só podem ser desativadas criando 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 especifique que as mensagens SOAP são protegidas por uma sessão segura.

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

    O exemplo de código a seguir usa a configuração para especificar uma associação personalizada que envia 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 MutualCertificate modo de autenticação 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()
    

Consulte também