Compartilhar via


Selecionando um tipo de credencial

Credenciais são os dados que o Windows Communication Foundation (WCF) usa para estabelecer uma identidade ou funcionalidades reivindicadas. 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 tomar muitas formas, como tokens de nome de usuário e certificados X.509. Este tópico discute as credenciais, como elas são usadas no WCF e como selecionar a credencial certa para o 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 os recursos de uma pessoa. Ela contém prova de posse na 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 ela não foi adulterada nem falsificada.

Apresentar uma credencial envolve apresentar os dados e a prova de posse dos dados. O WCF dá suporte a uma variedade de tipos de credenciais nos níveis de segurança de transporte e de mensagem. Por exemplo, considere dois tipos de credenciais com suporte no WCF: credenciais de nome de usuário e 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 nesse 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 campos Valid From e Valid To, especificam a validade do certificado.

Tipos de credencial de transporte

A tabela a seguir mostra os possíveis tipos de credenciais do cliente que podem ser usados por uma associação no modo de segurança de transporte. Ao criar um serviço, defina a propriedade ClientCredentialType 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ção Descrição
Nenhum Especifica que o cliente não precisa apresentar nenhuma credencial. Isso se traduz em um cliente anônimo.
Basic Especifica a autenticação básica para o cliente. Para obter mais informações, consulte RFC2617—Autenticação HTTP: autenticação básica e resumida.
Digest Especifica a autenticação resumida para o cliente. Para obter mais informações, consulte RFC2617—Autenticação HTTP: autenticação básica e resumida.
Ntlm Especifica a autenticação do 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 um fallback definindo a propriedade AllowNtlm como false que faz com que o WCF faça um melhor esforço para gerar uma exceção se NTLM for usado. Observe que definir essa propriedade para false pode não impedir que as credenciais NTLM sejam enviadas por fio.
Windows Especifica autenticação do Windows. Para especificar apenas o protocolo Kerberos em um domínio do Windows, defina a propriedade AllowNtlm como false (o padrão é true).
Certificado Executa a autenticação do cliente usando um certificado X.509.
Senha O usuário deve fornecer um nome de usuário e uma senha. Valide o par nome de usuário/senha usando autenticação do Windows ou outra solução personalizada.

Tipos de credencial de cliente de mensagem

A tabela a seguir mostra os possíveis tipos de credencial que você pode usar ao criar um aplicativo que usa a segurança da mensagem. Você pode usar esses valores em arquivos de código ou de configuração.

Configuração Descrição
Nenhum Especifica que o cliente não precisa apresentar uma credencial. Isso se traduz em um cliente anônimo.
Windows Permite que as trocas de mensagens SOAP ocorram no contexto de segurança estabelecido com uma credencial do Windows.
Nome de Usuário 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 é o Security Assertions Markup Language (SAML). 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

Negociação é o processo de estabelecer confiança entre um cliente e um serviço trocando credenciais. O processo é executado iterativamente entre o cliente e o serviço, de modo a divulgar apenas as informações necessárias para a próxima etapa no processo de negociação. Na prática, o resultado final é a entrega da credencial de um serviço para o cliente a ser usado 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 é a BasicHttpBinding, que não habilita a segurança por padrão.) Para desabilitar esse 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 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.

Negociação fora de banda

Se a negociação automática estiver desabilitada, a credencial de serviço deve ser provisionada no cliente antes de enviar qualquer mensagem ao serviço. Isso também é conhecido como um 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 deve 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 entre empresas. Essa negociação fora de banda pode ser feita por e-mail e o certificado X.509 é armazenado no repositório de certificados do Windows, usando uma ferramenta como o snap-in de Certificados do Console de Gerenciamento da Microsoft (MMC).

Observação

A propriedade ClientCredentials é usada para fornecer ao serviço um certificado que foi obtido por meio de negociação fora de banda. Isso é necessário ao usar a classe BasicHttpBinding porque a associação não permite negociação automatizada. A propriedade também é usada em um cenário duplex não relacionado. Esse é um cenário em que um servidor envia uma mensagem para o cliente sem exigir que o cliente envie primeiro uma solicitação ao servidor. 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ê deve associar uma credencial específica (como um certificado X.509 específico) ao serviço ou ao 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 do serviço

Se estiver usando o modo de transporte e HTTP como transporte, você deve usar os Serviços de Informações da Internet (IIS) ou configurar a porta com um certificado. Para obter mais informações, consulte Visão Geral de Segurança do Transporte e Segurança do Transporte HTTP.

Para provisionar um serviço com credenciais no código, crie uma instância da classe ServiceHost e especifique a credencial apropriada usando a classe ServiceCredentials, acessada por meio da propriedade Credentials.

Configurando 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 do cliente, use o método SetCertificate da classe X509CertificateInitiatorServiceCredential.

Definindo credenciais do Windows

Se o cliente especificar um nome de usuário e uma senha válidos, essa credencial é usada para autenticar o cliente. Caso contrário, as credenciais atuais do usuário conectado são usadas.

Definindo credenciais do cliente

No WCF, os aplicativos cliente usam um cliente WCF para se conectar aos serviços. Cada cliente deriva da classe ClientBase<TChannel> e a propriedade ClientCredentials no cliente permite a especificação de vários valores de credenciais do cliente.

Configurando um certificado

Para provisionar um serviço com um certificado X.509 que é usado para autenticar o cliente a um serviço, use o método SetCertificate da classe X509CertificateInitiatorClientCredential.

Como as credenciais do cliente são usadas para autenticar um cliente ao serviço

As informações de credencial do cliente necessárias para se comunicar com um serviço são fornecidas usando a propriedade ClientCredentials ou a propriedade Credentials. O canal de segurança usa essas informações para autenticar o cliente ao serviço. A autenticação é realizada por meio de um dos dois modos:

  • As credenciais do cliente são usadas uma vez antes do envio da primeira mensagem, usando a instância do cliente WCF para estabelecer um contexto de segurança. Todas as mensagens de aplicativo são protegidas por meio do contexto de segurança.

  • As credenciais do cliente são usadas para autenticar todas as mensagens de aplicativo enviadas ao serviço. Nesse caso, nenhum contexto é estabelecido entre o cliente e o serviço.

Identidades estabelecidas não podem ser alteradas

Quando o primeiro método é usado, o contexto estabelecido é permanentemente associado à identidade do cliente. Ou seja, depois que o contexto de segurança for estabelecido, a identidade associada ao cliente não poderá ser alterada.

Importante

Há uma situação a ser observada quando a identidade não pode ser alternada (ou seja, quando o contexto de segurança 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 poderá ser alterada. Isso se tornará 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. Em outras palavras, o serviço usa a identidade do primeiro cliente para todos os seus clientes se comunicarem com o segundo serviço. Isso pode levar à elevação do privilégio. Se esse não for o comportamento desejado do serviço, você deverá acompanhar 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 que o chamador certo se comunique 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.

Confira também