none
ProtocolException ao enviar credenciais inválidas (UserName/Password) ao Serviço. O tipo de conteúdo text/html; charset=utf-8 da mensagem de resposta não corresponde ao tipo de conteúdo da ligação RRS feed

  • Pergunta

  •  Problema ocorre quando o client tenta chamar o serviço passando uma credencial inválida (username ou password). Quando a credencial é válida, o serviço funciona normalmente.

    Para autenticação, utilizo uma implementação da interface IHttpModule , onde capturo o usuário e senha enviado pelo cliente via “Basic” e as valido contra um repositório particular de usuários.  

    Quando as credenciais não são válidas, a mensagem retornada para o cliente vem no formato HTML e não SOAP, provocando uma ProtocolException. Já tentei alterar as configurações do IIS e do serviço sem sucesso.

    Message          "O tipo de conteúdo text/html; charset=utf-8 da mensagem de resposta não corresponde ao tipo de conteúdo da ligação (application/soap+xml; charset=utf-8). Se estiver usando um codificador personalizado, verifique se o método IsContentTypeSupported está implementado corretamente. Os primeiros 1024 bytes da resposta foram: '<html>\r\n    <head>\r\n        <title>Usu&#225;rio e/ou Senha inv&#225;lidos</title>\r\n        <style>\r\n         body {font-family:\"Verdana\";font-weight:normal;font-size: .7em;color:black;} \r\n         p {font-family:\"Verdana\";font-weight:normal;color:black;margin-top: -5px}\r\n         b {font-family:\"Verdana\";font-weight:bold;color:black;margin-top: -5px}\r\n         H1 { font-family:\"Verdana\";font-

     Trecho do web.config (Server)

        <httpModules>

          <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

          <!-- habilitar a manipulação da credencial enviada pelo cliente no serviço-->

          <add name="BasicAuthenticationModule" type="POC.WcfService3.Service.Seguranca.UserNameAuthenticator,POC.WcfService3.Service" />

        </httpModules>

     

      <bindings>

          <wsHttpBinding>

            <binding name="wsBinding"

                     messageEncoding="Text"

                     maxReceivedMessageSize="2147483647"

                      openTimeout="0:01:00"

                      sendTimeout="00:05:00"

                      receiveTimeout="00:10:00">

              <security mode="Transport">

                <transport clientCredentialType="None" />

              </security>

              <readerQuotas />

            </binding>

          </wsHttpBinding>

     

    <behavior name="serviceBehaviorBasic">

              <serviceMetadata httpsGetEnabled="true" />

              <serviceDebug includeExceptionDetailInFaults="true" />

              <dataContractSerializer maxItemsInObjectGraph="2147483647"/>

              <serviceSecurityAudit serviceAuthorizationAuditLevel="Failure" auditLogLocation="Application"/>

              <serviceAuthorization serviceAuthorizationManagerType="POC.WcfService3.Service.Seguranca.MaximusAuthorizationManager,POC.WcfService3.Service">

                <authorizationPolicies>

                  <add policyType="POC.WcfService3.Service.Seguranca.Policy.RecursoPolicy, POC.WcfService3.Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />

                </authorizationPolicies>

              </serviceAuthorization>

              <faultServiceBehavior />

            </behavior>

          </serviceBehaviors>

        </behaviors>

        <services>

          <service behaviorConfiguration="serviceBehaviorBasic" name="POC.WcfService3.Service.Service1">

            <endpoint address="" behaviorConfiguration="" binding="wsHttpBinding" bindingConfiguration="wsBinding" contract="POC.WcfService3.Service.IService1" name="Service1WsEndPoint" >

              <identity>

                <dns value="localhost" />

              </identity>

            </endpoint>

            <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />

          </service>

     

    quarta-feira, 2 de março de 2011 19:45

Respostas

  • Olá Israel!

    Obrigado pela dica.

    Verifiquei as configurações nos dois endpoints e elas estão Ok!

    Entretanto, achei o problema !!!

    O que ocorria era o seguinte:  Na classe de validação que implementa a interface IHttpModule existe um método chamado OnAuthenticateRequest que captura as credenciais passadas pelo cliente de realiza a validação contra o meu cadastro de usuários. Entretanto, o a minha validação estava retornando uma CustomException quando as credenciais eram inválidas, quando o correto seria apenas retornar um app.Response.StatusCode = 401, para negar o acesso ao recurso. Por isso que ocorria esse problema de Protocol Exception. Corrigi esse problema e o retorno passou a ser System.ServiceModel.Security.MessageSecurityException, retornar na InnerException a mensagem “401 – Access Denied”, como esperado!

    Fica aí o registro para quem utilizar essa forma de validação via Custom Basic Authentication.

    Alessandro Brito

     

    quinta-feira, 3 de março de 2011 20:10

Todas as Respostas

  • Boas Alessandro,

    De certeza que a configuração do binding está correta em ambos os lados (cliente e serviço)?
    http://www.israelaece.com
    quinta-feira, 3 de março de 2011 11:54
    Moderador
  • Olá Israel!

    Obrigado pela dica.

    Verifiquei as configurações nos dois endpoints e elas estão Ok!

    Entretanto, achei o problema !!!

    O que ocorria era o seguinte:  Na classe de validação que implementa a interface IHttpModule existe um método chamado OnAuthenticateRequest que captura as credenciais passadas pelo cliente de realiza a validação contra o meu cadastro de usuários. Entretanto, o a minha validação estava retornando uma CustomException quando as credenciais eram inválidas, quando o correto seria apenas retornar um app.Response.StatusCode = 401, para negar o acesso ao recurso. Por isso que ocorria esse problema de Protocol Exception. Corrigi esse problema e o retorno passou a ser System.ServiceModel.Security.MessageSecurityException, retornar na InnerException a mensagem “401 – Access Denied”, como esperado!

    Fica aí o registro para quem utilizar essa forma de validação via Custom Basic Authentication.

    Alessandro Brito

     

    quinta-feira, 3 de março de 2011 20:10