2011-05-31 15 views
5

Tengo un servicio web que requiere autorización básica y un usuario detrás de un proxy de Internet que requiere autorización NTLM. También tengo una aplicación de formularios que realiza llamadas al servicio web y también le pide al usuario las credenciales del servicio web (que son diferentes de las credenciales NTLM).Solicitud de servicio web con autorización básica vía proxy con autorización NTLM no funciona

Obtuve la configuración de la aplicación funcionando (WCF ServiceModel), está usando las credenciales de proxy predeterminadas, la solicitud se está autenticando con el proxy, pero después de autenticarse con el servicio web no envía el cuerpo de la solicitud por algún motivo.

El proceso funciona si pruebo localmente sin el proxy NTLM. Perdón por los largos ejemplos, pero tuve que incluirlos.

primera solicitud:

Enviar:

POST http://www.myservice.com/service.asmx HTTP/1.1 
Content-Type: text/xml; charset=utf-8 
SOAPAction: "http://tempuri.org/MyMethod" 
Host: www.myservice.com 
Content-Length: 329 
Expect: 100-continue 
Accept-Encoding: gzip, deflate 
Proxy-Connection: Keep-Alive 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body>[...]</s:Body></s:Envelope> 

reciben:

HTTP/1.1 407 Proxy Authentication Required 
Proxy-Authenticate: NTLM 
Proxy-Authenticate: BASIC realm="corporaterealm" 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: text/html; charset=utf-8 
Proxy-Connection: close 
Set-Cookie: BCSI-CS-36204A5A7BBD24D9=2; Path=/ 
Connection: close 
Content-Length: 1057 
Proxy-Support: Session-Based-Authentication 

[...] 

segunda petición:

Enviar:

POST http://www.myservice.com/service.asmx HTTP/1.1 
Content-Type: text/xml; charset=utf-8 
SOAPAction: "http://tempuri.org/MyMethod" 
Accept-Encoding: gzip, deflate,gzip, deflate 
Proxy-Authorization: NTLM TlRMTVNTUAABAAAAB7IIoggACAAxAAAACQAJACgAAAAFASgKAAAAD1dTUkswNDg3MENPTUVUTkVU 
Host: www.myservice.com 
Content-Length: 0 

reciben:

HTTP/1.1 407 Proxy Authentication Required 
Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAEAAQADgAAAAFgomiysOwieqrhFEAAAAAAAAAALIAsgBIAAAABQLODgAAAA9DAE8ATQBFAFQATgBFAFQAAgAQAEMATwBNAEUAVABOAEUAVAABABoAVgBJAC0AUgBJAEMASwBEAEMALQAwADAAMQAEABwAYwBvAG0AZQB0AG4AZQB0AC4AbABvAGMAYQBsAAMAOABWAEkALQBSAEkAQwBLAEQAQwAtADAAMAAxAC4AYwBvAG0AZQB0AG4AZQB0AC4AbABvAGMAYQBsAAUAHABjAG8AbQBlAHQAbgBlAHQALgBsAG8AYwBhAGwAAAAAAA== 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: text/html; charset=utf-8 
Proxy-Connection: Keep-Alive 
Set-Cookie: BCSI-CS-36204A5A7BBD24D9=2; Path=/ 
Connection: Keep-Alive 
Content-Length: 1074 
Proxy-Support: Session-Based-Authentication 

[...] 

tercera petición:

Enviar:

POST http://www.myservice.com/service.asmx HTTP/1.1 
Content-Type: text/xml; charset=utf-8 
SOAPAction: "http://tempuri.org/MyMethod" 
Accept-Encoding: gzip, deflate,gzip, deflate,gzip, deflate 
Proxy-Authorization: NTLM TlRMTVNTUAADAAAAGAAYAHgAAAAYABgAkAAAABAAEABIAAAADgAOAFgAAAASABIAZgAAAAAAAACoAAAABYKIogUBKAoAAAAPQwBPAE0ARQBUAE4ARQBUAFAAYQByAHMAbwBuAEoAVwBTAFIASwAwADQAOAA3ADAAlap7g+mPRMEAAAAAAAAAAAAAAAAAAAAARLAhi5lf3nd+l9xENAcu2W6xf6iJbyM6 
Host: www.myservice.com 
Content-Length: 329 
Expect: 100-continue 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body>[...]</s:Body></s:Envelope> 

reciben:

HTTP/1.1 401 Unauthorized 
Content-Type: text/html 
Server: Microsoft-IIS/6.0 
WWW-Authenticate: Basic realm="myrealm" 
X-Powered-By: ASP.NET 
Date: Tue, 31 May 2011 13:09:33 GMT 
Cache-Control: proxy-revalidate 
Content-Length: 1656 
Proxy-Connection: Keep-Alive 
Connection: Keep-Alive 
Proxy-support: Session-based-authentication 
Age: 0 

[...] 

cuarta solicitud:

Enviar:

POST http://www.myservice.com/service.asmx HTTP/1.1 
Content-Type: text/xml; charset=utf-8 
SOAPAction: "http://tempuri.org/MyMethod" 
Accept-Encoding: gzip, deflate,gzip, deflate,gzip, deflate,gzip, deflate 
Authorization: Basic Y29nZW50YVxjb21ldC1kbTM6Kmh0JTg2NCU= 
Proxy-Authorization: NTLM TlRMTVNTUAABAAAAB7IIoggACAAxAAAACQAJACgAAAAFASgKAAAAD1dTUkswNDg3MENPTUVUTkVU 
Host: www.myservice.com 
Content-Length: 0 

reciben:

HTTP/1.1 400 Bad Request 
Date: Tue, 31 May 2011 13:09:33 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
X-AspNet-Version: 4.0.30319 
Cache-Control: private, proxy-revalidate 
Content-Length: 0 
Proxy-Connection: Keep-Alive 
Connection: Keep-Alive 
Age: 0 

No entiendo por qué no envía el sobre en la cuarta petición. Los dos apretones de manos están hechos, así que teóricamente todo debería estar bien.

Cuando hago esto localmente sin el proxy NTLM, el sobre se envía como se esperaba:

primera solicitud:

Enviar:

POST http://www.myservice.com/service.asmx HTTP/1.1 
Content-Type: text/xml; charset=utf-8 
SOAPAction: "http://tempuri.org/MyMethod" 
Host: www.myservice.com 
Content-Length: 329 
Expect: 100-continue 
Accept-Encoding: gzip, deflate 
Connection: Keep-Alive 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body>[...]</s:Body></s:Envelope> 

reciben:

HTTP/1.1 401 Unauthorized 
Content-Length: 1656 
Content-Type: text/html 
Server: Microsoft-IIS/6.0 
WWW-Authenticate: Basic realm="myrealm" 
X-Powered-By: ASP.NET 
Date: Tue, 31 May 2011 13:31:46 GMT 

[...] 

2º re búsqueda:

Enviar:

POST http://www.myservice.com/service.asmx HTTP/1.1 
Content-Type: text/xml; charset=utf-8 
SOAPAction: "http://tempuri.org/MyMethod" 
Accept-Encoding: gzip, deflate,gzip, deflate 
Authorization: Basic Y29nZW50YVxjb21ldC1kbTM6Kmh0JTg2NCU= 
Host: www.myservice.com 
Content-Length: 329 
Expect: 100-continue 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body>[...]</s:Body></s:Envelope> 

reciben:

HTTP/1.1 200 OK 
Date: Tue, 31 May 2011 13:31:47 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
X-AspNet-Version: 4.0.30319 
Set-Cookie: ASP.NET_SessionId=svv4i11awg05v1j5viz1impo; path=/; HttpOnly 
Cache-Control: private, max-age=0 
Content-Type: text/xml; charset=utf-8 
Content-Length: 5127 

[...] 
+0

¿Cuál es la biblioteca de cliente que está utilizando para enviar estas solicitudes? Algunas de las solicitudes parecen ... anómalas: por ejemplo, enviar un encabezado expect: continue junto con datos POST. –

+0

Estoy usando una referencia de servicio .NET WCF. Hay un objeto Sytem.ServiceModel. – Edgar

+0

que es más de lo que tengo con NTLM en .Net, ¿podría responder a http://stackoverflow.com/questions/4723062? – Keith

Respuesta

1

que tenía que cambiar la configuración de seguridad del servidor para aceptar la autenticación implícita. Por alguna razón que funciona mientras que Basic no funciona.

1

Encontré un problema potencialmente similar y creo que en mi caso esto puede estar relacionado con el establecimiento de la conexión NTLM original con el proxy.

En mi experiencia, tenía tres solicitudes saliendo en secuencia cada hora, con un reintento configurado.

De estas solicitudes, dos funcionarían, una fallaría con una 400 y luego, cuando la primera se reintentó, funcionaría también.

Hay un problema similar con el IE identificado aquí: http://blogs.msdn.com/b/asiatech/archive/2012/01/30/400-bad-request-when-posting-webservice-or-wcf-request-from-ie.aspx

me encontré con algunas trazas de red y vi el comportamiento y se dio cuenta de que a menudo los flujos TCP parecía estar compartida, por lo que una de las peticiones terminaría el envío un mensaje de autenticación NTLM (la longitud de contenido cero) para el proxy después de que el otro ya se haya autenticado. En esta situación, el proxy simplemente pasó por el mensaje de contenido cero (ya que la transmisión ya se había autenticado).

Lo que lo fijó para mí estaba moviendo a un WCF customBinding (usando textMessageEncoding con un messageVersion de Soap11 para mantener mi comportamiento basicHttpBinding) y (no estoy seguro si es necesario) establecer keepAliveEnabled a falso.

Lamentablemente, dudo que esto sea de mucha ayuda para su situación particular, pero más información nunca duele.

Cuestiones relacionadas