Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
As 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 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. 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 está lacrada e pode conter um holograma, mostrando que ela não foi adulterada ou falsificada.
A apresentação de uma credencial envolve a apresentação dos dados e a prova de posse dos dados. O WCF dá suporte a uma variedade de tipos de credencial nos níveis de segurança de transporte e de mensagem. Por exemplo, considere dois tipos de credenciais com suporte 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 nesse caso é o sistema que valida o nome de usuário e a senha.
Com uma credencial de certificado X.509, o nome do sujeito, o nome alternativo do sujeito 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 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. Isso se traduz em um 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 resumida para o cliente. Para obter informações adicionais, consulte RFC2617 – Autenticação HTTP: Autenticação Básica e Digest. |
| 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 a configuração dessa propriedade para false pode não impedir que as credenciais NTLM sejam enviadas por meio da rede. |
| 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. |
| Senha | O usuário deve fornecer um nome de usuário e uma senha. Valide o par nome de usuário/senha usando a 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ções | 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 operações criptográficas 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 a 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 do 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 deverá ser provisionada no cliente antes de enviar mensagens para o 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 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 de negócios para 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 BasicHttpBinding classe 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 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 ao cliente.
Dependendo de você estar programando um serviço ou um cliente, o método para definir o valor da credencial é ligeiramente diferente.
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 de 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.
Configurando um certificado
Para provisionar um serviço com um certificado X.509 a ser usado para autenticar o serviço para clientes, use o SetCertificate método da X509CertificateRecipientServiceCredential classe.
Para provisionar um serviço com um certificado de cliente, use o SetCertificate método da X509CertificateInitiatorServiceCredential classe.
Definindo credenciais do Windows
Se o cliente especificar um nome de usuário e uma senha válidos, essa credencial será usada para autenticar o cliente. Caso contrário, as credenciais atuais do usuário conectado são usadas.
Configurando credenciais do cliente
No WCF, os aplicativos cliente usam um cliente WCF para se conectar aos 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.
Configurando um certificado
Para provisionar um serviço com um certificado X.509, que é usado para autenticar o cliente em um serviço, utilize o método SetCertificate da 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 a propriedade Credentials. O canal de segurança usa essas informações para autenticar o cliente no 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 tiver sido 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 comunique 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 fizer-se 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. 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.
Consulte 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
- Protegendo serviços e clientes
- Programação de Segurança no WCF
- Segurança de transporte HTTP