Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
As credenciais são os dados que o Windows Communication Foundation (WCF) usa para estabelecer uma identidade ou recursos reivindicados. Por exemplo, um passaporte é uma credencial que um governo emite para provar a cidadania em um país ou região. No WCF, as credenciais podem assumir muitas formas, como tokens de nome de usuário e certificados X.509. Este tópico discute credenciais, como elas são usadas no WCF e como selecionar a credencial certa para seu aplicativo.
Em muitos países e regiões, uma carteira de motorista é um exemplo de credencial. Uma licença contém dados que representam a identidade e as capacidades de uma pessoa. Contém prova da posse sob a forma da imagem do possuidor. A licença é emitida por uma autoridade confiável, geralmente um departamento governamental de licenciamento. A licença é selada e pode conter um holograma, mostrando que não foi adulterada ou falsificada.
A apresentação de uma credencial envolve a apresentação dos dados e da prova de posse dos dados. O WCF oferece suporte a uma variedade de tipos de credenciais nos níveis de segurança de transporte e mensagem. Por exemplo, considere dois tipos de credenciais suportadas no WCF: nome de usuário e credenciais de certificado (X.509).
Para a credencial de nome de usuário, o nome de usuário representa a identidade reivindicada e a senha fornece prova de posse. A autoridade confiável, neste caso, é o sistema que valida o nome de usuário e a senha.
Com uma credencial de certificado X.509, o nome da entidade, o nome alternativo da entidade ou campos específicos dentro do certificado podem ser usados como declarações de identidade, enquanto outros campos, como os Valid From campos e Valid To , especificam a validade do certificado.
Tipos de credenciais de transporte
A tabela a seguir mostra os possíveis tipos de credenciais de cliente que podem ser usados por uma associação no modo de segurança de transporte. Ao criar um serviço, defina a ClientCredentialType propriedade como um desses valores para especificar o tipo de credencial que o cliente deve fornecer para se comunicar com seu serviço. Você pode definir os tipos em arquivos de código ou de configuração.
| Configurações | Descrição |
|---|---|
| Nenhum | Especifica que o cliente não precisa apresentar nenhuma credencial. Isto traduz-se num cliente anónimo. |
| Básico | Especifica a autenticação básica para o cliente. Para obter informações adicionais, consulte RFC2617 — Autenticação HTTP: Autenticação Básica e Digest. |
| Resumo | Especifica a autenticação digest para o cliente. Para obter informações adicionais, consulte RFC2617 — Autenticação HTTP: Autenticação Básica e Digest. |
| NTLM | Especifica a autenticação NT LAN Manager (NTLM). Isso é usado quando você não pode usar a autenticação Kerberos por algum motivo. Você também pode desativar o seu uso como fallback definindo a propriedade AllowNtlm como false, o que faz com que o WCF faça um esforço máximo para gerar uma exceção se NTLM for usado. Observe que definir essa propriedade como false pode não impedir que as credenciais NTLM sejam enviadas por fio. |
| Mac OS | Especifica a autenticação do Windows. Para especificar apenas o protocolo Kerberos em um domínio do Windows, defina a AllowNtlm propriedade como false (o padrão é true). |
| Certidão | Executa a autenticação do cliente usando um certificado X.509. |
| Palavra-passe | O usuário deve fornecer um nome de usuário e senha. Valide o par nome de usuário/senha usando a autenticação do Windows ou outra solução personalizada. |
Tipos de credenciais de cliente de mensagem
A tabela a seguir mostra os possíveis tipos de credenciais que você pode usar ao criar um aplicativo que usa segurança de mensagem. Você pode usar esses valores em arquivos de código ou de configuração.
| Configurações | Descrição |
|---|---|
| Nenhum | Especifica que o cliente não precisa apresentar uma credencial. Isto traduz-se num cliente anónimo. |
| Mac OS | Permite que as trocas de mensagens SOAP ocorram no contexto de segurança estabelecido com uma credencial do Windows. |
| Nome de utilizador | Permite que o serviço exija que o cliente seja autenticado com uma credencial de nome de usuário. Observe que o WCF não permite nenhuma operação criptográfica com nomes de usuário, como gerar uma assinatura ou criptografar dados. O WCF garante que o transporte seja protegido ao usar credenciais de nome de usuário. |
| Certidão | Permite que o serviço exija que o cliente seja autenticado usando um certificado X.509. |
| Token emitido | Um tipo de token personalizado configurado de acordo com uma política de segurança. O tipo de token padrão é SAML (Security Assertions Markup Language). O token é emitido por um serviço de token seguro. Para informações adicionais, consulte Federação e tokens emitidos. |
Modelo de Negociação de Credenciais de Serviço
A negociação é o processo de estabelecer confiança entre um cliente e um serviço através da troca de credenciais. O processo é realizado iterativamente entre o cliente e o serviço, de modo a divulgar apenas as informações necessárias para a próxima etapa do processo de negociação. Na prática, o resultado final é a entrega da credencial de um serviço ao cliente para ser usada em operações subsequentes.
Com uma exceção, por padrão, as associações fornecidas pelo sistema no WCF negociam a credencial de serviço automaticamente ao usar a segurança no nível da mensagem. (A exceção é o BasicHttpBinding, que não habilita a segurança por padrão.) Para desativar este comportamento, consulte as propriedades NegotiateServiceCredential e NegotiateServiceCredential.
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 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.
Negociação Fora de Banda
Se a negociação automática estiver desativada, a credencial de serviço deverá ser provisionada no cliente antes de enviar quaisquer mensagens para o serviço. Isso também é conhecido como o provisionamento fora de banda. Por exemplo, se o tipo de credencial especificado for um certificado e a negociação automática estiver desabilitada, o cliente deverá entrar em contato com o proprietário do serviço para receber e instalar o certificado no computador que executa o aplicativo cliente. Isso pode ser feito, por exemplo, quando você deseja controlar estritamente quais clientes podem acessar um serviço em um cenário business-to-business. Essa negociação fora de banda pode ser feita por email e o certificado X.509 é armazenado no armazenamento de certificados do Windows, usando uma ferramenta como o snap-in Certificados do Console de Gerenciamento Microsoft (MMC).
Observação
A ClientCredentials propriedade é usada para fornecer ao serviço um certificado que foi obtido através de negociação fora do canal. Isso é necessário ao usar a BasicHttpBinding classe porque a vinculação não permite negociação automatizada. A propriedade também é usada em um cenário duplex descorrelacionado. Este é um cenário em que um servidor envia uma mensagem para o cliente sem exigir que o cliente envie uma solicitação para o servidor primeiro. Como o servidor não tem uma solicitação do cliente, ele deve usar o certificado do cliente para criptografar a mensagem para o cliente.
Configuração de Valores de Credenciais
Depois de selecionar um modo de segurança, você deve especificar as credenciais reais. Por exemplo, se o tipo de credencial estiver definido como "certificado", você deverá associar uma credencial específica (como um certificado X.509 específico) ao serviço ou cliente.
Dependendo se você está programando um serviço ou um cliente, o método para definir o valor da credencial difere ligeiramente.
Definindo credenciais de serviço
Se você estiver usando o modo de transporte e estiver usando HTTP como transporte, deverá usar o IIS (Serviços de Informações da Internet) ou configurar a porta com um certificado. Para obter mais informações, consulte Visão geral da segurança de transporte e Segurança de transporte HTTP.
Para provisionar um serviço com credenciais no código, crie uma instância da ServiceHost classe e especifique a credencial apropriada usando a ServiceCredentials classe, acessada por meio da Credentials propriedade.
Definindo um certificado
Para provisionar um serviço com um certificado X.509 a ser usado para autenticar o serviço aos clientes, use o método SetCertificate da classe X509CertificateRecipientServiceCredential.
Para provisionar um serviço com um certificado de cliente, use o método da classe SetCertificateX509CertificateInitiatorServiceCredential.
Definindo credenciais do Windows
Se o cliente especificar um nome de usuário e senha válidos, essa credencial será usada para autenticar o cliente. Caso contrário, as credenciais do usuário conectado atual serão usadas.
Definindo credenciais de cliente
No WCF, os aplicativos cliente usam um cliente WCF para se conectar a serviços. Cada cliente deriva da ClientBase<TChannel> classe, e a ClientCredentials propriedade no cliente permite a especificação de vários valores de credenciais do cliente.
Definindo um certificado
Para provisionar um serviço com um certificado X.509, que é usado para autenticar o cliente junto a um serviço, use o método da SetCertificate classe X509CertificateInitiatorClientCredential.
Como as credenciais do cliente são usadas para autenticar um cliente no serviço
As informações de credenciais do cliente necessárias para se comunicar com um serviço são fornecidas usando a propriedade ClientCredentials ou Credentials. O canal de segurança usa essas informações para autenticar o cliente no serviço. A autenticação é realizada através de um de dois modos:
As credenciais do cliente são usadas uma vez antes da primeira mensagem ser enviada, usando a instância do cliente WCF para estabelecer um contexto de segurança. Todas as mensagens do aplicativo são então protegidas através do contexto de segurança.
As credenciais do cliente são usadas para autenticar todas as mensagens do aplicativo enviadas ao serviço. Neste caso, não é estabelecido qualquer contexto entre o cliente e o serviço.
As identidades estabelecidas não podem ser alteradas
Quando o primeiro método é usado, o contexto estabelecido é permanentemente associado à identidade do cliente. Ou seja, uma vez estabelecido o contexto de segurança, a identidade associada ao cliente não pode ser alterada.
Importante
Há uma situação a ser observada quando a identidade não pode ser trocada (ou seja, quando o contexto de segurança estabelecido está ativado, o comportamento padrão). Se você criar um serviço que se comunica com um segundo serviço, a identidade usada para abrir o cliente WCF para o segundo serviço não pode ser alterada. Isso se torna um problema se vários clientes tiverem permissão para usar o primeiro serviço e o serviço se fizer passar pelos clientes ao acessar o segundo serviço. Se o serviço reutilizar o mesmo cliente para todos os chamadores, todas as chamadas para o segundo serviço serão feitas sob a identidade do primeiro chamador que foi usado para abrir o cliente para o segundo serviço. Por outras palavras, o serviço utiliza a identidade do primeiro cliente para que todos os seus clientes comuniquem com o segundo serviço. Isso pode levar à elevação do privilégio. Se esse não for o comportamento desejado do seu serviço, você deve rastrear cada chamador e criar um novo cliente para o segundo serviço para cada chamador distinto e garantir que o serviço use apenas o cliente certo para o chamador certo se comunicar com o segundo serviço.
Para obter mais informações sobre credenciais e sessões seguras, consulte Considerações de segurança para sessões seguras.
Ver também
- System.ServiceModel.ClientBase<TChannel>
- ClientBase<TChannel>.ClientCredentials
- ClientCredentials.ClientCertificate
- BasicHttpMessageSecurity.ClientCredentialType
- HttpTransportSecurity.ClientCredentialType
- MessageSecurityOverHttp.ClientCredentialType
- MessageSecurityOverMsmq.ClientCredentialType
- MessageSecurityOverTcp.ClientCredentialType
- TcpTransportSecurity.ClientCredentialType
- X509CertificateInitiatorClientCredential.SetCertificate
- X509CertificateInitiatorServiceCredential.SetCertificate
- Conceitos de Segurança
- Proteger serviços e clientes
- Programação de Segurança WCF
- Segurança de Transporte HTTP