Usuário com melhor resposta
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

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ário e/ou Senha invá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>
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
- Marcado como Resposta Alessandro Antonio de Brito quinta-feira, 3 de março de 2011 20:11
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 -
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
- Marcado como Resposta Alessandro Antonio de Brito quinta-feira, 3 de março de 2011 20:11