Como: Especificar credenciais de segurança de canal
O Windows Communication Foundation (WCF) Service Moniker permite que aplicativos COM chamem serviços WCF. A maioria dos serviços WCF requer que o cliente especifique credenciais para autenticação e autorização. Ao chamar um serviço WCF de um cliente WCF, você pode especificar essas credenciais em código gerenciado ou em um arquivo de configuração de aplicativo. Ao chamar um serviço WCF de um aplicativo COM, você pode usar a IChannelCredentials interface para especificar credenciais. Este tópico ilustrará várias maneiras de especificar credenciais usando a IChannelCredentials interface.
Nota
IChannelCredentials é uma interface baseada em IDispatch e você não obterá a funcionalidade IntelliSense no ambiente do Visual Studio.
Este artigo usará o serviço WCF definido no Exemplo de segurança de mensagem.
Para especificar um certificado de cliente
Execute o arquivo Setup.bat no diretório Message Security para criar e instalar os certificados de teste necessários.
Abra o projeto Segurança de Mensagens.
Adicione
[ServiceBehavior(Namespace="http://Microsoft.ServiceModel.Samples")]
à definição deICalculator
interface.Adicione
bindingNamespace="http://Microsoft.ServiceModel.Samples"
à marca de ponto de extremidade no App.config para o serviço.Crie o Exemplo de Segurança de Mensagem e execute Service.exe. Navegue até o URI do serviço (
http://localhost:8000/ServiceModelSamples/Service
) para garantir que o serviço esteja funcionando.Abra o Visual Basic 6.0 e crie um novo arquivo de .exe padrão. Adicione um botão ao formulário e clique duas vezes no botão para adicionar o seguinte código ao manipulador Click:
monString = "service:mexAddress=http://localhost:8000/ServiceModelSamples/Service?wsdl" monString = monString + ", address=http://localhost:8000/ServiceModelSamples/Service" monString = monString + ", contract=ICalculator, contractNamespace=http://Microsoft.ServiceModel.Samples" monString = monString + ", binding=BasicHttpBinding_ICalculator, bindingNamespace=http://Microsoft.ServiceModel.Samples" Set monikerProxy = GetObject(monString) 'Set the Service Certificate. monikerProxy.ChannelCredentials.SetServiceCertificateAuthentication "CurrentUser", "NoCheck", "PeerOrChainTrust" monikerProxy.ChannelCredentials.SetDefaultServiceCertificateFromStore "CurrentUser", "TrustedPeople", "FindBySubjectName", "localhost" 'Set the Client Certificate. monikerProxy.ChannelCredentials.SetClientCertificateFromStoreByName "CN=client.com", "CurrentUser", "My" MsgBox monikerProxy.Add(3, 4)
Execute o aplicativo Visual Basic e verifique os resultados.
O aplicativo Visual Basic exibirá uma caixa de mensagem com o resultado da chamada Add(3, 4). SetClientCertificateFromFile(String, String, String) ou SetClientCertificateFromStoreByName(String, String, String) também pode ser usado no lugar de para definir o certificado do SetClientCertificateFromStore(String, String, String, Object) cliente:
monikerProxy.ChannelCredentials.SetClientCertificateFromFile "C:\MyClientCert.pfx", "password", "DefaultKeySet"
Nota
Para que essa chamada funcione, o certificado do cliente precisa ser confiável na máquina em que o cliente está sendo executado.
Nota
Se o moniker estiver malformado ou se o serviço não estiver disponível, a chamada para GetObject
retornará um erro dizendo "Sintaxe inválida". Se você receber esse erro, verifique se o moniker que você está usando está correto e se o serviço está disponível.
Para especificar nome de usuário e senha
Modifique o arquivo Service App.config para usar o
wsHttpBinding
arquivo . Isso é necessário para a validação de nome de usuário e senha:Defina o
clientCredentialType
como UserName:Abra o Visual Basic 6.0 e crie um novo arquivo de .exe padrão. Adicione um botão ao formulário e clique duas vezes no botão para adicionar o seguinte código ao manipulador Click:
monString = "service:mexAddress=http://localhost:8000/ServiceModelSamples/Service?wsdl" monString = monString + ", address=http://localhost:8000/ServiceModelSamples/Service" monString = monString + ", contract=ICalculator, contractNamespace=http://Microsoft.ServiceModel.Samples" monString = monString + ", binding=WSHttpBinding_ICalculator, bindingNamespace=http://Microsoft.ServiceModel.Samples" Set monikerProxy = GetObject(monString) monikerProxy.ChannelCredentials.SetServiceCertificateAuthentication "CurrentUser", "NoCheck", "PeerOrChainTrust" monikerProxy.ChannelCredentials.SetUserNameCredential "username", "password" MsgBox monikerProxy.Add(3, 4)
Execute o aplicativo Visual Basic e verifique os resultados. O aplicativo Visual Basic exibirá uma caixa de mensagem com o resultado da chamada Add(3, 4).
Nota
A associação especificada no moniker de serviço neste exemplo foi alterada para WSHttpBinding_ICalculator. Observe também que você deve fornecer um nome de usuário e senha válidos na chamada para SetUserNameCredential(String, String).
Para especificar as credenciais do Windows
Defina
clientCredentialType
como Windows no arquivo Service App.config:Abra o Visual Basic 6.0 e crie um novo arquivo de .exe padrão. Adicione um botão ao formulário e clique duas vezes no botão para adicionar o seguinte código ao manipulador Click:
monString = "service:mexAddress=http://localhost:8000/ServiceModelSamples/Service?wsdl" monString = monString + ", address=http://localhost:8000/ServiceModelSamples/Service" monString = monString + ", contract=ICalculator, contractNamespace=http://Microsoft.ServiceModel.Samples" monString = monString + ", binding=WSHttpBinding_ICalculator, bindingNamespace=http://Microsoft.ServiceModel.Samples" monString = monString + ", upnidentity=domain\userID" Set monikerProxy = GetObject(monString) monikerProxy.ChannelCredentials.SetWindowsCredential "domain", "userID", "password", 1, True MsgBox monikerProxy.Add(3, 4)
Execute o aplicativo Visual Basic e verifique os resultados. O aplicativo Visual Basic exibirá uma caixa de mensagem com o resultado da chamada Add(3, 4).
Nota
Você deve substituir "domain", "userID" e "password" por valores válidos.
Para especificar um token de emissão
Os tokens de emissão são usados apenas para aplicativos que usam segurança federada. Para obter mais informações sobre segurança federada, consulte Federação e tokens emitidos e Exemplo de federação.
O exemplo de código do Visual Basic a seguir ilustra como chamar o SetIssuedToken(String, String, String) método:
monString = "service:mexAddress=http://localhost:8000/ServiceModelSamples/Service?wsdl" monString = monString + ", address=http://localhost:8000/SomeService/Service" monString = monString + ", contract=ICalculator, contractNamespace=http://SomeService.Samples" monString = monString + ", binding=WSHttpBinding_ISomeContract, bindingNamespace=http://SomeService.Samples" Set monikerProxy = GetObject(monString) monikerProxy.SetIssuedToken("http://somemachine/sts", "bindingType", "binding")
Para obter mais informações sobre os parâmetros para esse método, consulte SetIssuedToken(String, String, String).