Visão geral de segurança de transporte
Os mecanismos de segurança de transporte no WCF (Windows Communication Foundation) dependem da associação e do transporte que estão sendo usados. Por exemplo, ao usar a classe WSHttpBinding, o transporte é HTTP e o mecanismo principal para proteger o transporte é o SSL (Secure Sockets Layer) via HTTP, normalmente chamado HTTPS. Este tópico discute os principais mecanismos de segurança do transporte usados nas associações fornecidas pelo sistema WCF.
Observação
Quando a segurança SSL é usada com o .NET Framework 3.5 e posterior, um cliente WCF usa os certificados intermediários em seu repositório de certificados e os certificados intermediários recebidos durante a negociação SSL para executar a validação da cadeia de certificados no certificado de serviço. O .NET Framework 3.0 usa apenas os certificados intermediários instalados no repositório de certificados local.
Aviso
Quando a segurança do transporte é usada, a propriedade Thread.CurrentPrincipal pode ser substituída. Para evitar que isso aconteça, defina ServiceAuthorizationBehavior.PrincipalPermissionMode como PrincipalPermissionMode.None. ServiceAuthorizationBehavior é um comportamento de serviço que pode ser definido na descrição do serviço.
BasicHttpBinding
Por padrão, a classe BasicHttpBinding não fornece segurança. Essa associação foi projetada para interoperabilidade com provedores de serviço Web que não implementam a segurança. No entanto, você pode ativar a segurança definindo a propriedade Mode como qualquer valor, exceto None. Para habilitar a segurança do transporte, defina a propriedade como Transport.
Interoperação com IIS
A classe BasicHttpBinding é usada principalmente para interoperar com serviços Web existentes, sendo muitos desses serviços hospedados pelo IIS (Serviços de Informações da Internet). Consequentemente, a segurança do transporte dessa associação foi projetada para uma interoperação perfeita com sites do IIS. Isso é feito definindo o modo de segurança como Transport e, em seguida, definindo o tipo de credencial do cliente. Os valores de tipo de credencial correspondem aos mecanismos de segurança de diretório do IIS. O código a seguir mostra o modo que está sendo definido e o tipo de credencial definido como Windows. Você pode usar essa configuração quando o cliente e o servidor estiverem no mesmo domínio do Windows.
BasicHttpBinding b = new BasicHttpBinding();
b.Security.Mode = BasicHttpSecurityMode.Transport ;
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
Dim b As BasicHttpBinding = New BasicHttpBinding()
b.Security.Mode = BasicHttpSecurityMode.Transport
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows
Ou em nossa configuração:
<bindings>
<basicHttpBinding>
<binding name="SecurityByTransport">
<security mode="Transport">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
</bindings>
As seções a seguir abordam outros tipos de credenciais do cliente.
Basic
Isso corresponde ao método de autenticação Básica no IIS. Ao usar esse modo, o servidor IIS deve ser configurado com contas de usuário do Windows e as permissões apropriadas do sistema de arquivos NTFS. Para obter mais informações sobre o IIS 6.0, consulte Habilitar a autenticação Básica e configurar o nome do realm. Para obter mais informações sobre o IIS 7.0, consulte Configurar a Autenticação Básica (IIS 7).
Certificado
O IIS tem uma opção para exigir que os clientes façam logon com um certificado. O recurso também permite que o IIS mapeie um certificado do cliente para uma conta do Windows. Para obter mais informações sobre o IIS 6.0, consulte Habilitar certificados do cliente no IIS 6.0. ***Para obter mais informações sobre o IIS 7.0, consulte Como configurar certificados de servidor no IIS 7.
Digest
A autenticação hash é semelhante à autenticação Básica, mas oferece a vantagem de enviar as credenciais como um resumo da mensagem, em vez de em texto claro. Para mais informações sobre o IIS 6.0, consulte Autenticação por hash no IIS 6.0. Para obter mais informações sobre o IIS 7.0, consulte Configurar a Autenticação por hash (IIS 7).
Windows
Isso corresponde à autenticação do Windows integrada no IIS. Quando definido como esse valor, espera-se que o servidor também exista em um domínio do Windows que usa o protocolo Kerberos como seu controlador de domínio. Se o servidor não estiver em um domínio com suporte Kerberos ou se o sistema Kerberos falhar, você poderá usar o valor NTLM (NT LAN Manager) descrito na próxima seção. Para obter mais informações sobre o IIS 6.0, consulte Autenticação integrada do Windows no IIS 6.0. Para obter mais informações sobre o IIS 7.0, consulte Como configurar certificados de servidor no IIS 7.
NTLM
Isso permite que o servidor use o NTLM para autenticação se o protocolo Kerberos falhar. Para obter mais informações sobre como configurar o IIS no IIS 6.0, consulte Como forçar a autenticação NTLM. Para o IIS 7.0, a autenticação do Windows inclui a autenticação NTLM. Para obter mais informações, consulte Configurando certificados de servidor no IIS 7.
WSHttpBinding
A classe WSHttpBinding foi projetada para interoperar com serviços que implementam especificações WS-*. A segurança do transporte para essa associação é a SSL (Secure Sockets Layer) via HTTP ou HTTPS. Para criar um aplicativo WCF que usa SSL, use o IIS para hospedar o aplicativo. Como alternativa, se você estiver criando um aplicativo auto-hospedado, use a ferramenta HttpCfg.exe para associar um certificado X.509 a uma porta específica em um computador. O número da porta é especificado como parte do aplicativo WCF como um endereço de ponto de extremidade. Ao usar o modo de transporte, o endereço do ponto de extremidade deverá incluir o protocolo HTTPS ou uma exceção será lançada em tempo de execução. Para obter mais informações, consulte Segurança do transporte de HTTP.
Para autenticação de cliente, defina a propriedade ClientCredentialType da classe HttpTransportSecurity como um dos valores de enumeração HttpClientCredentialType. Os valores de enumeração são idênticos aos tipos de credenciais do cliente para BasicHttpBinding e foram projetados para serem hospedados com serviços do IIS.
O exemplo a seguir mostra a associação que está sendo usada com um tipo de credencial do cliente do Windows.
// The code uses a shortcut to specify the security mode to Transport.
WSHttpBinding b = new WSHttpBinding(SecurityMode.Transport);
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
' The code uses a shortcut to specify the security mode to Transport.
Dim b As WSHttpBinding = New WSHttpBinding(SecurityMode.Transport)
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows
WSDualHttpBinding
Essa associação fornece apenas segurança no nível da mensagem, não segurança no nível do transporte.
NetTcpBinding
A classe NetTcpBinding usa o protocolo TCP para transporte de mensagens. A segurança para o modo de transporte é fornecida pela implementação do protocolo TLS (Transport Layer Security) por TCP. A implementação do TLS é fornecida pelo sistema operacional.
Você também pode especificar o tipo de credencial do cliente definindo a propriedade ClientCredentialType da classe TcpTransportSecurity como um dos valores TcpClientCredentialType, conforme mostra o código a seguir.
NetTcpBinding b = new NetTcpBinding();
b.Security.Mode = SecurityMode.Transport;
b.Security.Transport.ClientCredentialType =
TcpClientCredentialType.Certificate;
Dim b As NetTcpBinding = New NetTcpBinding()
b.Security.Mode = SecurityMode.Transport
b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate
Cliente
No lado cliente, você deve especificar um certificado usando o método SetCertificate da classe X509CertificateInitiatorClientCredential.
Observação
Se você estiver usando a segurança do Windows, não será necessário um certificado.
O código a seguir usa a impressão digital do certificado, que o identifica exclusivamente. Para obter mais informações sobre certificados, consulte Working with Certificates (Trabalhando com certificados).
NetTcpBinding b = new NetTcpBinding();
b.Security.Mode = SecurityMode.Transport;
b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate;
EndpointAddress a = new EndpointAddress("net.tcp://contoso.com/TcpAddress");
ChannelFactory<ICalculator> cf = new ChannelFactory<ICalculator>(b, a);
cf.Credentials.ClientCertificate.SetCertificate(
StoreLocation.LocalMachine,
StoreName.My,
X509FindType.FindByThumbprint,
"0000000000000000000000000000000000000000");
Dim b As NetTcpBinding = New NetTcpBinding()
b.Security.Mode = SecurityMode.Transport
b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate
Dim a As New EndpointAddress("net.tcp://contoso.com/TcpAddress")
Dim cf As ChannelFactory(Of ICalculator) = New ChannelFactory(Of ICalculator)(b, a)
cf.Credentials.ClientCertificate.SetCertificate( _
StoreLocation.LocalMachine, _
StoreName.My, _
X509FindType.FindByThumbprint, _
"0000000000000000000000000000000000000000")
Como alternativa, especifique o certificado na configuração do cliente usando um elemento <clientCredentials> na seção de comportamentos.
<behaviors>
<behavior>
<clientCredentials>
<clientCertificate findValue= "101010101010101010101010101010000000000"
storeLocation="LocalMachine" storeName="My"
X509FindType="FindByThumbPrint">
</clientCertificate>
</clientCredentials>
</behavior>
</behaviors>
NetNamedPipeBinding
A classe NetNamedPipeBinding foi projetada para uma comunicação intra-computacional eficiente; ou seja, para processos em execução no mesmo computador, embora canais de pipe nomeados possam ser criados entre dois computadores na mesma rede. Essa associação fornece apenas segurança no nível do transporte. Ao criar aplicativos usando essa associação, os endereços de ponto de extremidade deverão incluir "net.pipe" como o protocolo do endereço do ponto de extremidade.
WSFederationHttpBinding
Ao usar a segurança de transporte, essa associação usa SSL via HTTP, conhecido como HTTPS com um token emitido (TransportWithMessageCredential). Para obter mais informações sobre aplicativos de federação, consulte Federação e tokens emitidos.
NetPeerTcpBinding
A classe NetPeerTcpBinding é um transporte seguro, projetado para uma comunicação eficiente usando o recurso de rede ponto a ponto. Conforme indicado pelo nome da classe e da associação, TCP é o protocolo. Quando o modo de segurança é definido como Transporte, a associação implementa o TLS por TCP. Para obter mais informações sobre o recurso ponto a ponto, consulte Rede ponto a ponto.
MsmqIntegrationBinding e NetMsmqBinding
Para obter uma discussão completa sobre a segurança do transporte com o Enfileiramento de Mensagens (anteriormente chamado de MSMQ), consulte Como proteger mensagens usando a segurança do transporte.