Como: especificar credenciais de segurança de canal
O Moniker de Serviço do Windows Communication Foundation (WCF) permite que aplicativos COM chamem os serviços do WCF. A maioria dos serviços WCF exige 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 interface IChannelCredentials para especificar credenciais. Este tópico ilustrará várias maneiras de especificar credenciais usando a interface IChannelCredentials.
Observação
IChannelCredentials é uma interface baseada em IDispatch e você não obterá a funcionalidade do 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 do cliente
Execute o arquivo Setup.bat no diretório de segurança de mensagem para criar e instalar os certificados de teste necessários.
Abra o projeto de segurança de mensagem.
Adicione
[ServiceBehavior(Namespace="http://Microsoft.ServiceModel.Samples")]
à definição da interfaceICalculator
.Adicione
bindingNamespace="http://Microsoft.ServiceModel.Samples"
à marca de ponto de extremidade no App.config do 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 .exe Standard. Adicione um botão ao formulário e clique duas vezes no botão para adicionar o seguinte código ao manipulador Clicar:
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 do 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 SetClientCertificateFromStore(String, String, String, Object) para definir o certificado do cliente:
monikerProxy.ChannelCredentials.SetClientCertificateFromFile "C:\MyClientCert.pfx", "password", "DefaultKeySet"
Observação
Para que essa chamada funcione, o certificado do cliente precisa ser confiável no computador no qual o cliente está sendo executado.
Observação
Se o moniker estiver malformado ou se o serviço não estiver disponível, a chamada retornará um erro GetObject
com "Sintaxe inválida". Se você receber esse erro, verifique se o moniker usado está correto e se o serviço está disponível.
Para especificar um nome de usuário e uma senha
Modifique o arquivo App.config de serviço para usar o
wsHttpBinding
. Isso é necessário para 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 .exe Standard. Adicione um botão ao formulário e clique duas vezes no botão para adicionar o seguinte código ao manipulador Clicar:
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 do Visual Basic e verifique os resultados. O aplicativo Visual Basic exibirá uma caixa de mensagem com o resultado da chamada Add(3, 4).
Observação
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 válido e uma senha na chamada para SetUserNameCredential(String, String).
Para especificar credenciais do Windows
Definir
clientCredentialType
como Windows no arquivo App.config de serviço:Abra o Visual Basic 6.0 e crie um novo arquivo .exe Standard. Adicione um botão ao formulário e clique duas vezes no botão para adicionar o seguinte código ao manipulador Clicar:
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 do Visual Basic e verifique os resultados. O aplicativo Visual Basic exibirá uma caixa de mensagem com o resultado da chamada Add(3, 4).
Observação
Você deve substituir "domain", "userID" e "password" por valores válidos.
Para especificar um token de problema
Os tokens de problema 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 método SetIssuedToken(String, String, String):
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).