Visão geral da segurança de transporte
Os mecanismos de segurança de transporte no Windows Communication Foundation (WCF) dependem da associação e do transporte que estão sendo usados. Por exemplo, ao usar a WSHttpBinding classe, o transporte é HTTP, e o principal mecanismo para proteger o transporte é Secure Sockets Layer (SSL) sobre HTTP, comumente chamado HTTPS. Este tópico discute os principais mecanismos de segurança de transporte usados nas associações fornecidas pelo sistema WCF.
Nota
Quando a segurança SSL é usada com o .NET Framework 3.5 e posterior, um cliente WCF usa os certificados intermediários em seu armazenamento de certificados e os certificados intermediários recebidos durante a negociação SSL para executar a validação da cadeia de certificados no certificado do serviço. O .NET Framework 3.0 usa apenas os certificados intermediários instalados no armazenamento de certificados local.
Aviso
Quando a segurança de transporte é usada, a Thread.CurrentPrincipal propriedade pode ser substituída. Para evitar que isso aconteça, defina o ServiceAuthorizationBehavior.PrincipalPermissionMode para PrincipalPermissionMode.None. ServiceAuthorizationBehavior é um comportamento de serviço que pode ser definido na descrição do serviço.
BasicHttpBinding
Por padrão, a BasicHttpBinding classe não fornece segurança. Essa associação foi projetada para interoperabilidade com provedores de serviços Web que não implementam segurança. No entanto, você pode ativar a segurança definindo a Mode propriedade para qualquer valor, exceto None. Para habilitar a segurança de transporte, defina a propriedade como Transport.
Interoperação com o IIS
A BasicHttpBinding classe é usada principalmente para interoperar com serviços Web existentes, e muitos desses serviços são hospedados pelo IIS (Serviços de Informações da Internet). Consequentemente, a segurança de transporte para essa vinculação foi projetada para interoperação perfeita com sites do IIS. Isso é feito definindo o modo de segurança para 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, na configuração:
<bindings>
<basicHttpBinding>
<binding name="SecurityByTransport">
<security mode="Transport">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
</bindings>
As seções a seguir discutem outros tipos de credenciais de cliente.
Básica
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 permissões apropriadas do sistema de arquivos NTFS. Para obter mais informações sobre o IIS 6.0, consulte Habilitando a autenticação básica e configurando o nome do território. 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 de cliente para uma conta do Windows. Para obter mais informações sobre o IIS 6.0, consulte Habilitando certificados de cliente no IIS 6.0. Para obter mais informações sobre o IIS 7.0, consulte Configurando certificados de servidor no IIS 7.
Resumo
A autenticação Digest é semelhante à autenticação Básica, mas oferece a vantagem de enviar as credenciais como um hash, em vez de em texto não criptografado. Para obter mais informações sobre o IIS 6.0, consulte Autenticação Digest no IIS 6.0. Para obter mais informações sobre o IIS 7.0, consulte Configurar autenticação digest (IIS 7).
Windows
Isso corresponde à autenticação integrada do Windows no IIS. Quando definido para 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 apoiado por Kerberos, ou se o sistema Kerberos falhar, você poderá usar o valor NT LAN Manager (NTLM) 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 Configurando certificados de servidor no IIS 7.
NTLM
Isso permite que o servidor use NTLM para autenticação se o protocolo Kerberos falhar. Para obter mais informações sobre como configurar o IIS no IIS 6.0, consulte Forçando a autenticação NTLM. Para o IIS 7.0, a autenticação do Windows inclui autenticação NTLM. Para obter mais informações, consulte Configurando certificados de servidor no IIS 7.
WsHttpBinding
A WSHttpBinding classe é projetada para interoperação com serviços que implementam especificações WS-*. A segurança de transporte para essa associação é SSL (Secure Sockets Layer) sobre 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 vincular 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 deve incluir o protocolo HTTPS ou uma exceção será lançada em tempo de execução. Para obter mais informações, consulte Segurança de transporte HTTP.
Para autenticação de cliente, defina a ClientCredentialTypeHttpTransportSecurity propriedade da classe como um dos HttpClientCredentialType valores de enumeração. Os valores de enumeração são idênticos aos tipos de credenciais de cliente para BasicHttpBinding e são 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 de 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 NetTcpBinding classe usa TCP para transporte de mensagens. A segurança para o modo de transporte é fornecida pela implementação do Transport Layer Security (TLS) sobre TCP. A implementação TLS é fornecida pelo sistema operacional.
Você também pode especificar o tipo de credencial do cliente definindo a ClientCredentialType propriedade da TcpTransportSecurity classe como um dos TcpClientCredentialType valores, conforme mostrado no 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 cliente, você deve especificar um certificado usando o SetCertificate método da X509CertificateInitiatorClientCredential classe.
Nota
Se estiver a utilizar a segurança do Windows, não é 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 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 comportamentos.
<behaviors>
<behavior>
<clientCredentials>
<clientCertificate findValue= "101010101010101010101010101010000000000"
storeLocation="LocalMachine" storeName="My"
X509FindType="FindByThumbPrint">
</clientCertificate>
</clientCredentials>
</behavior>
</behaviors>
NetNamedPipeBinding
A NetNamedPipeBinding classe é projetada para comunicação eficiente entre máquinas, ou seja, para processos executados 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 de transporte. Ao criar aplicativos usando essa ligação, os endereços de ponto de extremidade devem incluir "net.pipe" como o protocolo do endereço de ponto final.
WSFederationHttpBinding
Ao usar a segurança de transporte, essa associação usa SSL sobre 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 NetPeerTcpBinding classe é um transporte seguro projetado para comunicação eficiente usando o recurso de rede ponto a ponto. Como indicado pelo nome da classe e ligação, TCP é o protocolo. Quando o modo de segurança é definido como Transporte, a associação implementa TLS sobre 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 de transporte com o serviço de enfileiramento de mensagens (anteriormente chamado de MSMQ), consulte Protegendo mensagens usando a segurança de transporte.