Usuário com melhor resposta
Erro : Specify a service certificate in ClientCredentials

Pergunta
-
Boa tarde galera. Estou com um pequeno problema. Estou utilizando basicHttpBinding para tentar criar um serviço com autenticação.
O sistema está reportando o seguinte erro: The service certificate is not provided for target 'http://localhost:8000/'. Specify a service certificate in ClientCredentials.
O serviço esta funcionando certinho. Já criei o criei o certificado. Mas quando tento consumir o serviço através de um cliente web, ocorre este erro acima.
using (ServicoECM.ServicoECMClient proxy = new ServicoECM.ServicoECMClient()) { this.StoreGrupoTipoDocumentoID.DataSource = proxy.ObterGrupoDocumentos().ToList(); this.StoreGrupoTipoDocumentoID.DataBind(); }
Vou disponibilizar meu appconfig e meu web config para vocês visualizarem e tentar me ajudar. :)Appconfig:
<system.serviceModel> <services> <service name="Stoque.ECM.Servico.ServicoECM" behaviorConfiguration="ServicoECMBehavior"> <host> <baseAddresses> <add baseAddress="http://localhost:8000/" /> </baseAddresses> </host> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IServicoECM" contract="Stoque.ECM.Contrato.IServicoECM" name="BasicHttpBinding_IServicoECM" /> </service> </services> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IServicoECM" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="1966080" maxBufferPoolSize="1966080" maxReceivedMessageSize="1966080" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> <readerQuotas maxDepth="1000" maxStringContentLength="1966080" maxArrayLength="1966080" maxBytesPerRead="1966080" maxNameTableCharCount="1966080" /> <security mode ="Message"> <message clientCredentialType="Certificate" /> </security> </binding> </basicHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="ServicoECMBehavior"> <serviceMetadata httpGetEnabled="True"/> <serviceDebug includeExceptionDetailInFaults="False" /> <serviceCredentials> <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="TrustedPeople" x509FindType="FindBySubjectName" /> <!--<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Stoque.ECM.Servico.Security, Stoque.ECM.Servico" />--> </serviceCredentials> </behavior> </serviceBehaviors> </behaviors>
Webconfig:<system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IServicoECM" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> <security mode="Message"> <message clientCredentialType="Certificate"/> </security> </binding> </basicHttpBinding> </bindings> <behaviors> <endpointBehaviors> <behavior name="ServicoECMBehavior"> <clientCredentials> <clientCertificate findValue="localhost" storeLocation="LocalMachine" storeName="TrustedPeople" x509FindType="FindBySubjectName" /> </clientCredentials> </behavior> </endpointBehaviors> </behaviors> <client> <endpoint address="http://localhost:8000/" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IServicoECM" contract="ServicoECM.IServicoECM" name="BasicHttpBinding_IServicoECM" behaviorConfiguration="ServicoECMBehavior" > <identity> <dns value="localhost" /> </identity> </endpoint> </client> </system.serviceModel>
Eu ia fazer um resumo dos arquivos de configuração, mas resolvi deixar completo para ter mais certeza.
Vlw galera, qualquer sugestão será bem vinda.
Grande abraço.
Respostas
-
Boas Tiguebas,
Você pode utilizar apenas um certificado, onde o WCF utilizaria para proteger as mensagens que são trocadas entre o cliente e o serviço. Ao expor o serviço com este certificado configurado, a chave pública do mesmo é colocada no documento WSDL, e no ato da referência ao cliente, ele faz o download desta chave e mantém no cliente para que as requisições sejam criptografadas com ele.
Você pode visualizar alguns exemplos aqui:
http://www.israelaece.com/post/WCF-Seguranca-Autenticacao-e-Autorizacao-Customizadas.aspx
http://www.israelaece.com/post/WCF-Integrando-MembershipProvider-e-RoleProvider.aspx
http://www.israelaece.com- Sugerido como Resposta AndreAlvesLimaModerator quarta-feira, 13 de julho de 2011 16:04
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 12 de janeiro de 2012 21:22
Todas as Respostas
-
Boas Tiguebas,
Mas a sua ideia é criar um serviço e autenticar o usuário através de um certificado?
http://www.israelaece.com -
Boas Israel,
Sim, mas ainda tenho que colocar o userNameAuthentication no modo custom. E depois tenho que implementar a autorização dos arquivos. Eu já vi vários exemplos de aplicações utilizando wsHttpBinding, mas eu preciso utilizar o basicHttpBinding pois outros serviços vão acessar minha aplicação.
Mas primeiramente queria ver o certificado funcionando. :)
Obrigado.
-
Consegui fazer o certificado funcionar com o wsHttpBinding, porém ficou muito lenta a aplicação. Eu criei dois certificados, um para o cliente e outro para o serviço. Ai funcionou certinho.
A ideia da minha aplicação é acessar o serviço através de um cliente web e desktop, mas o mesmo poderá ser acessado por web services.
No cliente web o usuário vai fazer a autenticação (login e senha). Estou pretendendo utilizar essas credenciais do usuário para fazer "login" no serviço também. Assim eu utilizaria o certificado e a autenticação customizada do WCF passando a mesma senha que foi utilizada no cliente web.
Seria essa a ideia mesmo? Tenho dúvidas em relação essas questões de arquitetura. Só não estamos querendo trabalhar com Roles e MemberShip do Asp.Net.
Qualquer sugestão será bem vinda.
Vlw.
-
Boas Tiguebas,
Você pode utilizar apenas um certificado, onde o WCF utilizaria para proteger as mensagens que são trocadas entre o cliente e o serviço. Ao expor o serviço com este certificado configurado, a chave pública do mesmo é colocada no documento WSDL, e no ato da referência ao cliente, ele faz o download desta chave e mantém no cliente para que as requisições sejam criptografadas com ele.
Você pode visualizar alguns exemplos aqui:
http://www.israelaece.com/post/WCF-Seguranca-Autenticacao-e-Autorizacao-Customizadas.aspx
http://www.israelaece.com/post/WCF-Integrando-MembershipProvider-e-RoleProvider.aspx
http://www.israelaece.com- Sugerido como Resposta AndreAlvesLimaModerator quarta-feira, 13 de julho de 2011 16:04
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 12 de janeiro de 2012 21:22
-
Opá Israel. Faz muito tempo que você me respondeu, mas fui visualizar hoje. Nós deixamos essa parte de segurança da aplicação mais para frente, por isso não vi sua resposta.
Agora estamos retornando com a autenticação. Estou executando minha aplicação e estou achando ela muito lenta depois que comecei a utilizar a criptografia da mensagem. Não existe uma forma de autenticar sem utilizar criptografia? Eu li isso no seu blog, mas quem sabe já surgiu essa possibilidade.
Para tentar melhorar a performance da aplicação eu setei para todas os métodos do meu contrato para não colocar segurança na mensagem.
[OperationContract(ProtectionLevel= ProtectionLevel.None)]
Estou utilizando EF4 e WCF. Sei que é bem difícil analisar assim, mas você teria alguma ideia dessa lentidão? Já desabilitei o lazyloading do EF4.
Nos projetos clientes foram gerados os services referencies e criado os proxy. E os métodos são acessados via proxy. Não tem nada mais além disso.
Existe alguma ferramenta para analisar os gargalos da aplicação?
Você teria algumas dicas para melhorar a performance da aplicação?
Obrigado Israel, sua ajuda tem sido fundamental para mim. Pena que só você responde neste fórum, e isso acarreta uma lentidão nas respostas, afinal você é um só né. E são tantas questões ...
Abs e sucesso!!!
-
Tiguebas,
Conseguiu solucionar essas suas dúvidas?
André Alves de Lima
Microsoft MVP - Client App Dev
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima