Partilhar via


Selecionando um tipo de credencial

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.

Definição Descrição
None Especifica que o cliente não precisa apresentar nenhuma credencial. Isto traduz-se num cliente anónimo.
Básica 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 desabilitar seu uso como fallback definindo a propriedade como false, o que faz com que o AllowNtlm WCF faça um esforço melhor para lançar 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.
Windows 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).
Certificado 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.

Definição Descrição
None Especifica que o cliente não precisa apresentar uma credencial. Isto traduz-se num cliente anónimo.
Windows Permite que as trocas de mensagens SOAP ocorram no contexto de segurança estabelecido com uma credencial do Windows.
Username 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.
Certificado 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 obter mais informações, 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 , que não habilita a BasicHttpBindingsegurança por padrão.) Para desativar esse comportamento, consulte as NegotiateServiceCredential propriedades e NegotiateServiceCredential .

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.

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

Nota

A ClientCredentials propriedade é usada para fornecer o serviço com um certificado que foi obtido através de negociação fora da banda. 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 não correlacionado. 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.

Definindo valores de credencial

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 para clientes, use o SetCertificateX509CertificateRecipientServiceCredential método da classe.

Para provisionar um serviço com um certificado de cliente, use o SetCertificateX509CertificateInitiatorServiceCredential método da classe.

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 em um serviço, use o SetCertificateX509CertificateInitiatorClientCredential método da classe.

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 ClientCredentials propriedade ou a Credentials propriedade. 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 representar os 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.

Consulte também