none
WCF - Erros diversos RRS feed

  • Pergunta

  • Pessoal,

    Estou realmente precisando de uma grande e iluminada ajuda para fazer essa coisa de maluco, chamada WCF, funcionar.

    Já estou a ponto de jogar a toalha e refazer tudo no bom e velho ASMX.

    Vamos aos problemas:

    Cenário
    Aqui na empresa existe um controle bastante rígido de acesso. Há servidores em redes diferentes e com diferentes níveis de segurança.
    O WCF que implementei está sendo utilizado por diversas aplicações dentro da rede com um nível de segurança relativamente baixo, pois é apenas de acesso interno.
    No entanto, foi desenvolvida uma nova aplicação que foi colocada em um servidor, de acesso externo (ai entram aqueles conceitos obscuros de rede que eu não faço idéia), onde está numa rede com nível de segurança elevado.

    Como o WCF está rodando na rede menos segura, então foi feita uma "ponte" para que o servidor na rede mais segura pudesse acessar o WCF. Daí vieram uma infinidade de mensagens de erro, pois fiz testes com diversas combinações de configuração e nenhuma permitiu que a rede mais segura acessasse a menos segura. No entanto, em testes feitos, o inverso é possível, mas não posso alterar o WCF de local.

    Eu estou usando o SessionMode = Required no WCF.

    A última configuração e a que aparenta ter alguma fagulha de solução é a detalhada abaixo. Se eu colocar o WCF e AppWeb no mesmo servidor, tudo funciona lindo. Mas se colocar conforme cenário descrito acima, dá o erro.

    Mensagem de erro que ocorre quando a AppWeb tenta acessar o WCF:

    The request for security token could not be satisfied because authentication failed.

    Web.config do WCF

    Obs: Eu coloquei um "bindConfiguration" abaixo, mas ele não está sendo usado pelo endPoint. Se eu habilitar, a mensagem de erro é:

    Contract requires Session, but Binding 'WSHttpBinding' doesn't support it or isn't configured properly to support it.

    <system.serviceModel>
    
            <services>
                <service name="WcfTeste.Service1" behaviorConfiguration="WcfTeste.Service1Behavior">
                    <endpoint address="" binding="wsHttpBinding" contract="WcfTeste.IService1">
                        <identity>
                            <dns value="localhost"/>
                        </identity>
                    </endpoint>
                    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
                </service>
            </services>
    
            <behaviors>
                <serviceBehaviors>
                    <behavior name="WcfTeste.Service1Behavior">
                        <serviceMetadata httpGetEnabled="true"/>
                        <serviceDebug includeExceptionDetailInFaults="true"/>
                    </behavior>
                </serviceBehaviors>
            </behaviors>
    
            <bindings>
                <wsHttpBinding>
                    <binding name="NoSecurityBinding">
                        <security mode="None">
                            <transport clientCredentialType="None"/>
                            <message establishSecurityContext="true"/>
                        </security>
                    </binding>
                </wsHttpBinding>
            </bindings>
    
        </system.serviceModel>
    Web.config da AppWeb

    Esse arquivo foi gerado automaticamente pela ferramenta de ServiceReference do VWD 2008.

        <system.serviceModel>
            <bindings>
                <wsHttpBinding>
                    <binding name="WSHttpBinding_IService1" closeTimeout="00:01:00"
                     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                     bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                     maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
                     textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
                        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                         maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                        <reliableSession ordered="true" inactivityTimeout="00:10:00"
                         enabled="false" />
                        <security mode="Message">
                            <transport clientCredentialType="Windows" proxyCredentialType="None"
                             realm="" />
                            <message clientCredentialType="Windows" negotiateServiceCredential="true"
                             establishSecurityContext="true" />
                        </security>
                    </binding>
                </wsHttpBinding>
            </bindings>
            <client>
                <endpoint address="http://wcftestedsv/Service1.svc"
                 binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService1"
                 contract="WcfTeste.IService1" name="WSHttpBinding_IService1">
                    <identity>
                        <dns value="localhost" />
                    </identity>
                </endpoint>
            </client>
        </system.serviceModel>
    Se eu alterar o Security Mode para None, também dá erro.

    Enfim, esse é meu cenário !!!

    Alguém tem idéia de como solucionar isso? Helllllllllllp.....
    Mamão com açúcar! Se resolveu, classifique a mensagem, por favor!
    sexta-feira, 18 de setembro de 2009 14:56

Respostas

  • Boas Danilo,

    A segurança não está relacionada com a sessão. Acho que ela não está habilitada do lado do serviço:


        <system.serviceModel>
            <services>
                <service name="WcfTeste.Service1" behaviorConfiguration="WcfTeste.Service1Behavior">
                    <endpoint address="" binding="wsHttpBinding" contract="WcfTeste.IService1" bindingConfiguration="NoSecurityBinding">
                        <identity>
                            <dns value="localhost"/>
                        </identity>
                    </endpoint>
                    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
                </service>
            </services>
            <bindings>
                <wsHttpBinding>
                    <binding name="NoSecurityBinding">
                        <reliableSession enabled="true"/>
                        <security mode="None">
                            <transport clientCredentialType="None"/>
                            <message establishSecurityContext="true"/>
                        </security>
                    </binding>
                </wsHttpBinding>
            </bindings>
        </system.serviceModel>
    http://www.israelaece.com
    • Marcado como Resposta Danilo Freitas segunda-feira, 21 de setembro de 2009 21:02
    sexta-feira, 18 de setembro de 2009 17:44
    Moderador

Todas as Respostas

  • Boas Danilo,

    A primeira coisa que deve fazer é sincronizar as configurações de segurança entre o cliente e o serviço. Se você coloca o bindingConfiguration no seu serviço, o problema ocorre porque na configuração, você definiu o modo de segurança para None, enquanto no cliente está configurado para Message.

    Note também que você configurou o binding no serviço, mas não ligou ao endpoint:

        <system.serviceModel>
            <services>
                <service name="WcfTeste.Service1" behaviorConfiguration="WcfTeste.Service1Behavior">
                    <endpoint address="" binding="wsHttpBinding" contract="WcfTeste.IService1" bindingConfiguration="NoSecurityBinding">
                        <identity>
                            <dns value="localhost"/>
                        </identity>
                    </endpoint>
                    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
                </service>
            </services>
            <bindings>
                <wsHttpBinding>
                    <binding name="NoSecurityBinding">
                        <security mode="None">
                            <transport clientCredentialType="None"/>
                            <message establishSecurityContext="true"/>
                        </security>
                    </binding>
                </wsHttpBinding>
            </bindings>
        </system.serviceModel>


    http://www.israelaece.com
    sexta-feira, 18 de setembro de 2009 15:07
    Moderador
  • Israel,

    O bloco do bindConfiguration eu coloquei para mostrar uma das formas que eu estava fazendo. Tanto é que coloquei a observação de que quando eu vinculo o bindConfiguration no endPoint, dá erro.

    A segurança também está configurada correta, pois o padrão (até onde entendi) é ser do tipo "Message" (no WCF). Por conta disso que o web.config da app cliente definiu como "Message".

    Em resumo: Eu não posso habilitar segurança como "Transport", pois o protocolo é http. Se eu definir "None" (como mencioneu acima) dá erro dizendo que "Contract requires session...". Se eu definir "Message", o WCF funciona tranquilo, as apps clientes dentro da mesma rede acessam sem problemas, mas apps clientes fora da rede (conforme cenário descrito) apresentam erro: "The request for security token could not be satisfied because authentication failed."

    Eu testei várias "combinações" de configuração entre serviço e cliente, mas nenhuma delas com sucesso. Não há possibilidade de trocar a aplicação de servidor, muito menos alterar a localização do mesmo com outras aplicações.

    Alguma sugestão?
    Mamão com açúcar! Se resolveu, classifique a mensagem, por favor!
    sexta-feira, 18 de setembro de 2009 16:54
  • Boas Danilo,

    A segurança não está relacionada com a sessão. Acho que ela não está habilitada do lado do serviço:


        <system.serviceModel>
            <services>
                <service name="WcfTeste.Service1" behaviorConfiguration="WcfTeste.Service1Behavior">
                    <endpoint address="" binding="wsHttpBinding" contract="WcfTeste.IService1" bindingConfiguration="NoSecurityBinding">
                        <identity>
                            <dns value="localhost"/>
                        </identity>
                    </endpoint>
                    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
                </service>
            </services>
            <bindings>
                <wsHttpBinding>
                    <binding name="NoSecurityBinding">
                        <reliableSession enabled="true"/>
                        <security mode="None">
                            <transport clientCredentialType="None"/>
                            <message establishSecurityContext="true"/>
                        </security>
                    </binding>
                </wsHttpBinding>
            </bindings>
        </system.serviceModel>
    http://www.israelaece.com
    • Marcado como Resposta Danilo Freitas segunda-feira, 21 de setembro de 2009 21:02
    sexta-feira, 18 de setembro de 2009 17:44
    Moderador
  • Israel, você é o cara!

    Eu tinha setado true na app cliente, mas não no WCF.

    Valeu !!!

    Mamão com açúcar! Se resolveu, classifique a mensagem, por favor!
    segunda-feira, 21 de setembro de 2009 21:03