none
Erro : Specify a service certificate in ClientCredentials RRS feed

  • 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.

     

    sexta-feira, 1 de julho de 2011 19:06

Respostas

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
    segunda-feira, 4 de julho de 2011 00:11
    Moderador
  • 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. 



    segunda-feira, 4 de julho de 2011 12:23
  • 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.


    quarta-feira, 6 de julho de 2011 12:24
  • 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
    quarta-feira, 13 de julho de 2011 11:05
    Moderador
  • 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!!!

     

     

    sexta-feira, 5 de agosto de 2011 18:43
  • 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
    segunda-feira, 24 de outubro de 2011 17:53
    Moderador