Compartilhar via


Como: usar credenciais de mensagem e segurança do transporte

Proteger um serviço com credenciais de transporte e mensagem usa o melhor dos modos de segurança de transporte e mensagem no WCF (Windows Communication Foundation). Além disso, a segurança da camada de transporte fornece integridade e confidencialidade, enquanto a segurança da camada de mensagens fornece uma variedade de credenciais que não são possíveis com mecanismos de segurança de transporte estritos. Este tópico mostra as etapas básicas para implementar o transporte com credenciais de mensagem usando as associações WSHttpBinding e NetTcpBinding. Para obter mais informações sobre como definir o modo de segurança, confira Como definir o modo de segurança.

Ao definir o modo de segurança como TransportWithMessageCredential, o transporte determina o mecanismo real que fornece a segurança no nível do transporte. Para HTTP, o mecanismo é a SSL (Secure Sockets Layer) via HTTP (HTTPS); para TCP, é SSL por TCP ou Windows.

Se o transporte for HTTP (usando o WSHttpBinding), a SSL via HTTP fornecerá a segurança no nível do transporte. Nesse caso, você deve configurar o computador que hospeda o serviço com um certificado SSL associado a uma porta, conforme mostrado posteriormente neste tópico.

Se o transporte for TCP (usando o NetTcpBinding), por padrão, a segurança de nível de transporte fornecida será a segurança do Windows ou SSL por TCP. Ao usar o SSL no TCP, você deve especificar o certificado usando o método SetCertificate, conforme mostrado posteriormente neste tópico.

Para usar o WSHttpBinding com um certificado para segurança de transporte (em código)

  1. Use a ferramenta HttpCfg.exe para associar um certificado SSL a uma porta no computador. Para obter mais informações, confira Como configurar uma porta com um certificado SSL.

  2. Crie uma instância da classe WSHttpBinding e defina a propriedade Mode como TransportWithMessageCredential.

  3. Defina a propriedade ClientCredentialType com um valor apropriado. (Para obter mais informações, confira Selecionar um tipo de credencial.) O código a seguir usa o valor Certificate.

  4. Crie uma instância da classe Uri com um endereço base apropriado. Observe que o endereço deve usar o esquema "HTTPS" e deve conter o nome real do computador e o número da porta ao qual o certificado SSL está associado. (Como alternativa, você pode definir o endereço base na configuração.)

  5. Adicione um ponto de extremidade de serviço usando o método AddServiceEndpoint.

  6. Crie a instância do método ServiceHost e chame o método Open, conforme mostrado no código a seguir.

    WSHttpBinding b = new WSHttpBinding();
    b.Security.Mode = SecurityMode.TransportWithMessageCredential;
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    
    // The SSL certificate is bound to port 8006 using the HttpCfg.exe tool.
    Uri httpsAddress = new Uri("https://localMachineName:8006/base");
    ServiceHost sh = new ServiceHost(typeof(Calculator), httpsAddress);
    sh.AddServiceEndpoint(typeof(ICalculator), b, "HttpsCalculator");
    sh.Open();
    Console.WriteLine("Listening");
    Console.ReadLine();
    
    Dim b As New WSHttpBinding()
    b.Security.Mode = SecurityMode.TransportWithMessageCredential
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate
    
    ' The SSL certificate is bound to port 8006 using the HttpCfg.exe tool.
    Dim httpsAddress As New Uri("https://localMachineName:8006/base")
    Dim sh As New ServiceHost(GetType(Calculator), httpsAddress)
    sh.AddServiceEndpoint(GetType(ICalculator), b, "HttpsCalculator")
    sh.Open()
    Console.WriteLine("Listening")
    Console.ReadLine()
    

Para usar o NetTcpBinding com um certificado para segurança de transporte (em código)

  1. Crie uma instância da classe NetTcpBinding e defina a propriedade Mode como TransportWithMessageCredential.

  2. Defina o ClientCredentialType com um valor apropriado. O código a seguir usa o valor Certificate.

  3. Crie uma instância da classe Uri com um endereço base apropriado. Observe que o endereço deve usar o esquema "net.tcp". (Como alternativa, você pode definir o endereço base na configuração.)

  4. Crie uma instância da classe ServiceHost.

  5. Use o método SetCertificate da classe X509CertificateRecipientServiceCredential para definir explicitamente o certificado X.509 para o serviço.

  6. Adicione um ponto de extremidade de serviço usando o método AddServiceEndpoint.

  7. Chame o método Open, conforme mostrado no exemplo a seguir.

    NetTcpBinding b = new NetTcpBinding(SecurityMode.TransportWithMessageCredential);
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    Uri netTcpAddress = new Uri("net.tcp://baseAddress");
    ServiceHost sh = new ServiceHost(typeof(Calculator), netTcpAddress);
    sh.Credentials.ServiceCertificate.SetCertificate(
        StoreLocation.LocalMachine, StoreName.My,
        X509FindType.FindByIssuerName, "Contoso.com");
    sh.AddServiceEndpoint(typeof(ICalculator), b, "TcpCalculator");
    sh.Open();
    Console.WriteLine("Listening");
    Console.ReadLine();
    
    Dim b As New NetTcpBinding(SecurityMode.TransportWithMessageCredential)
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate
    Dim netTcpAddress As New Uri("net.tcp://baseAddress")
    Dim sh As New ServiceHost(GetType(Calculator), netTcpAddress)
    sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByIssuerName, "Contoso.com")
    sh.AddServiceEndpoint(GetType(ICalculator), b, "TcpCalculator")
    sh.Open()
    Console.WriteLine("Listening")
    Console.ReadLine()
    

Para usar o NetTcpBinding com Windows para segurança de transporte (em código)

  1. Crie uma instância da classe NetTcpBinding e defina a propriedade Mode como TransportWithMessageCredential.

  2. Defina a segurança de transporte para usar o Windows definindo o ClientCredentialType como Windows. (Observe que esse é o padrão.)

  3. Defina o ClientCredentialType com um valor apropriado. O código a seguir usa o valor Certificate.

  4. Crie uma instância da classe Uri com um endereço base apropriado. Observe que o endereço deve usar o esquema "net.tcp". (Como alternativa, você pode definir o endereço base na configuração.)

  5. Crie uma instância da classe ServiceHost.

  6. Use o método SetCertificate da classe X509CertificateRecipientServiceCredential para definir explicitamente o certificado X.509 para o serviço.

  7. Adicione um ponto de extremidade de serviço usando o método AddServiceEndpoint.

  8. Chame o método Open, conforme mostrado no exemplo a seguir.

    NetTcpBinding b = new NetTcpBinding(SecurityMode.TransportWithMessageCredential);
    b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    Uri netTcpAddress = new Uri("net.tcp://Tcp");
    ServiceHost sh = new ServiceHost(typeof(Calculator), netTcpAddress);
    sh.Credentials.ServiceCertificate.SetCertificate(
        StoreLocation.LocalMachine, StoreName.My,
        X509FindType.FindByIssuerName, "Contoso.com");
    sh.AddServiceEndpoint(typeof(ICalculator), b, "TcpCalculator");
    sh.Open();
    Console.WriteLine("Listening");
    Console.ReadLine();
    
    Dim b As New NetTcpBinding(SecurityMode.TransportWithMessageCredential)
    b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate
    Dim netTcpAddress As New Uri("net.tcp://Tcp")
    Dim sh As New ServiceHost(GetType(Calculator), netTcpAddress)
    sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByIssuerName, "Contoso.com")
    sh.AddServiceEndpoint(GetType(ICalculator), b, "TcpCalculator")
    sh.Open()
    Console.WriteLine("Listening")
    Console.ReadLine()
    

Usando a configuração

Para usar o WSHttpBinding

  1. Configure o computador com um certificado SSL associado a uma porta. (Para obter mais informações, confira Como configurar uma porta com um certificado SSL). Você não precisa definir um valor de elemento <transport> com essa configuração.

  2. Especifique o tipo de credencial do cliente para a segurança no nível da mensagem. O exemplo a seguir define o atributo clientCredentialType do elemento <message> como UserName.

    <wsHttpBinding>  
    <binding name="WsHttpBinding_ICalculator">  
            <security mode="TransportWithMessageCredential" >  
               <message clientCredentialType="UserName" />  
            </security>  
    </binding>  
    </wsHttpBinding>  
    

Para usar o NetTcpBinding com um certificado para segurança de transporte

  1. Para SSL por TCP, você deve especificar explicitamente o certificado no elemento <behaviors>. O exemplo a seguir especifica um certificado por seu emissor no local do repositório padrão (computador local e repositórios pessoais).

    <behaviors>  
     <serviceBehaviors>  
       <behavior name="mySvcBehavior">  
           <serviceCredentials>  
             <serviceCertificate findValue="contoso.com"  
                                 x509FindType="FindByIssuerName" />  
           </serviceCredentials>  
       </behavior>  
     </serviceBehaviors>  
    </behaviors>  
    
  2. Adicionar um <netTcpBinding> à seção de associações

  3. Adicione um elemento de associação e defina o atributo name a um valor apropriado.

  4. Adicione um elemento<security> e defina o atributo mode como TransportWithMessageCredential.

  5. Adicione um elemento <message> e defina o atributo clientCredentialType como um valor apropriado.

    <bindings>  
    <netTcpBinding>  
      <binding name="myTcpBinding">  
        <security mode="TransportWithMessageCredential" >  
           <message clientCredentialType="Windows" />  
        </security>  
      </binding>  
    </netTcpBinding>  
    </bindings>  
    

Para usar o NetTcpBinding com Windows para segurança de transporte

  1. Adicione um <netTcpBinding> à seção de associações.

  2. Adicione um elemento <binding> e defina o atributo name como um valor apropriado.

  3. Adicione um elemento<security> e defina o atributo mode como TransportWithMessageCredential.

  4. Adicione um elemento <transport> e defina o atributo clientCredentialType como Windows.

  5. Adicione um elemento <message> e defina o atributo clientCredentialType como um valor apropriado. O código a seguir define o valor como um certificado.

    <bindings>  
    <netTcpBinding>  
      <binding name="myTcpBinding">  
        <security mode="TransportWithMessageCredential" >  
           <transport clientCredentialType="Windows" />  
           <message clientCredentialType="Certificate" />  
        </security>  
      </binding>  
    </netTcpBinding>  
    </bindings>  
    

Confira também