Como: Especificar valores de credenciais de cliente
Usando o Windows Communication Foundation (WCF), o serviço pode especificar como um cliente é autenticado no serviço. Por exemplo, um serviço pode estipular que o cliente seja autenticado com um certificado.
Para determinar o tipo de credencial do cliente
Recupere metadados do ponto de extremidade de metadados do serviço. Os metadados geralmente consistem em dois arquivos: o código do cliente na linguagem de programação de sua escolha (o padrão é Visual C#) e um arquivo de configuração XML. Uma maneira de recuperar metadados é usar a ferramenta Svcutil.exe para retornar o código do cliente e a configuração do cliente. Para obter mais informações, consulte Recuperando metadados e ServiceModel Metadata Utility Tool (Svcutil.exe).
Abra o arquivo de configuração XML. Se você usar a ferramenta Svcutil.exe, o nome padrão do arquivo é Output.config.
Localize o elemento de segurança> com o atributo mode (<modo de segurança =
MessageOrTransport
> ondeMessageOrTransport
está definido como um dos modos de segurança.<Localize o elemento filho que corresponde ao valor do modo. Por exemplo, se o modo estiver definido como Mensagem, localize o <elemento de mensagem> contido no <elemento de segurança>.
Observe o valor atribuído ao atributo clientCredentialType . O valor real depende de qual modo é usado, transporte ou mensagem.
O código XML a seguir mostra a configuração de um cliente usando segurança de mensagem e exigindo um certificado para autenticar o cliente.
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Certificate" negotiateServiceCredential="true"
algorithmSuite="Default" establishSecurityContext="true" />
</security>
Exemplo: Modo de Transporte TCP com Certificado como Credencial de Cliente
Este exemplo define o modo de segurança como Modo de transporte e define o valor da credencial do cliente como um certificado X.509. Os procedimentos a seguir demonstram como definir o valor da credencial do cliente no cliente em código e configuração. Isso pressupõe que você tenha usado a ServiceModel Metadata Utility Tool (Svcutil.exe) para retornar os metadados (código e configuração) do serviço. Para obter mais informações, consulte Como criar um cliente.
Para especificar o valor da credencial do cliente no código do cliente
Use a ServiceModel Metadata Utility Tool (Svcutil.exe) para gerar código e configuração do serviço.
Crie uma instância do cliente WCF usando o código gerado.
Na classe de cliente, defina a ClientCredentialsClientBase<TChannel> propriedade da classe como um valor apropriado. Este exemplo define a propriedade como um certificado X.509 usando o SetCertificateX509CertificateInitiatorClientCredential método da classe.
// Create a binding using Transport and a certificate. NetTcpBinding b = new NetTcpBinding(); b.Security.Mode = SecurityMode.Transport; b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate; // Create an EndPointAddress. EndpointAddress ea = new EndpointAddress( "net.tcp://localHost:8036/Calculator/MyCalculator"); // Create the client. CalculatorClient cc = new CalculatorClient(b, ea); // Set the certificate for the client. cc.ClientCredentials.ClientCertificate.SetCertificate( StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName, "cohowinery.com"); try { cc.Open(); // Begin using the client. Console.WriteLine(cc.Divide(1001, 2)); cc.Close(); } catch (AddressAccessDeniedException adExc) { Console.WriteLine(adExc.Message); Console.ReadLine(); } catch (System.Exception exc) { Console.WriteLine(exc.Message); Console.ReadLine(); }
' Create a binding using Transport and a certificate. Dim b As New NetTcpBinding() b.Security.Mode = SecurityMode.Transport b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate ' Create an EndPointAddress. Dim ea As New EndpointAddress("net.tcp://localHost:8036/Calculator/MyCalculator") ' Create the client. Dim cc As New CalculatorClient(b, ea) ' Set the certificate for the client. cc.ClientCredentials.ClientCertificate.SetCertificate( _ StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName, "cohowinery.com") Try cc.Open() ' Begin using the client. Console.WriteLine(cc.Divide(1001, 2)) cc.Close() Catch adExc As AddressAccessDeniedException Console.WriteLine(adExc.Message) Console.ReadLine() Catch exc As System.Exception Console.WriteLine(exc.Message) Console.ReadLine() End Try
Você pode usar qualquer uma das enumerações da X509FindType classe. O nome do assunto é usado aqui no caso de o certificado ser alterado (devido a uma data de validade). O uso do nome da entidade permite que a infraestrutura encontre o certificado novamente.
Para especificar o valor da credencial do cliente no cliente na configuração
Adicione um <elemento de comportamento> ao <elemento behaviors>.
Adicione um elemento clientCredentials> ao <elemento behaviors>.< Certifique-se de definir o atributo necessário
name
para um valor apropriado.Adicione um elemento clientCertificate> ao< elemento clientCredentials>.<
Defina os seguintes atributos para valores apropriados:
storeLocation
,storeName
,x509FindType
efindValue
, conforme mostrado no código a seguir. Para obter mais informações sobre certificados, consulte Trabalhando com certificados.<behaviors> <endpointBehaviors> <behavior name="endpointCredentialBehavior"> <clientCredentials> <clientCertificate findValue="Contoso.com" storeLocation="LocalMachine" storeName="TrustedPeople" x509FindType="FindBySubjectName" /> </clientCredentials> </behavior> </endpointBehaviors> </behaviors>
Ao configurar o cliente, especifique o comportamento definindo o
behaviorConfiguration
<endpoint>
atributo do elemento , conforme mostrado no código a seguir. O elemento endpoint é filho do elemento client>.< Além disso, especifique o nome da configuração de vinculação definindo obindingConfiguration
atributo para a associação para o cliente. Se você estiver usando um arquivo de configuração gerado, o nome da associação será gerado automaticamente. Neste exemplo, o nome é"tcpBindingWithCredential"
.<client> <endpoint name ="" address="net.tcp://contoso.com:8036/aloha" binding="netTcpBinding" bindingConfiguration="tcpBindingWithCredential" behaviorConfiguration="endpointCredentialBehavior" /> </client>
Consulte também
- NetTcpBinding
- SetCertificate
- X509CertificateRecipientServiceCredential
- ClientBase<TChannel>
- X509CertificateInitiatorClientCredential
- Programação WCF Segurança
- Selecionando um tipo de credencial
- Ferramenta Utilitário de Metadados ServiceModel (Svcutil.exe)
- Trabalhando com certificados
- Como: Criar um cliente
- <netTcpBinding>
- <Segurança >
- <mensagem>
- <comportamento>
- <comportamentos>
- <clientCertificate>
- <clientCredenciais>