2011-08-31 15 views
5

Mi aplicación C# golpea un servidor web que usa autenticación NTLM.¿Cómo 'compartir' la autenticación NTLM en múltiples HttpWebRequests?

Encuentro que cada solicitud hecha al servidor (usando una nueva HttpWebRequest) se autentica individualmente. En otras palabras, cada solicitud da como resultado una respuesta 401, después de lo cual se produce una conversación NTLM handshaking antes de obtener la respuesta real.

por ejemplo:

solicitud GET Primero:

-> GET xyz 
<- 401 error (WWW-Authenticate:NTLM) 

-> GET xyz (Authorization:NTLM base64stuff) 
<- 401 error (WWW-Authenticate:NTLM base64stuff) 

-> GET xyz (Authorization: base64stuff) 
<- 200 

solicitudes posteriores:

-> GET xyz (Authorization:NTLM base64stuff) 
<- 401 error (WWW-Authenticate:NTLM) //can this request be avoided? 

-> GET xyz (Authorization: base64stuff) 
<- 200 

(inicialmente, con PreAuthenticate establece en false, las solicitudes posteriores parecía a la primera solicitud - es decir, tres solicitudes subyacentes por 'solicitud')

¿Hay alguna forma de 'compartir' la autenticación realizada en la primera solicitud al servidor con las siguientes HttpWebRequests?

Pensé que quizás la propiedad UnsafeAuthenticatedConnectionSharing me permitiría hacer esto, pero establecerlo como verdadero para todos los objetos HttpWebRequest utilizados en la aplicación no tiene ningún efecto.

Sin embargo, si configuro PreAuthenticate como verdadero, se produce una respuesta menos 401 para cada solicitud después de la primera.

+0

Cuál es el problema que trata de resolver? –

+0

Quiero efectivamente 'hacer autenticación' una vez, y reutilizar esto a través de HttpWebRequests. En lugar de autenticar cada vez que presiono el servidor. Sin embargo, es posible que esté malinterpretando NTLM, y de hecho NTLM impone una sobrecarga de una solicitud adicional en cada solicitud realizada. – mackenir

+0

Sí, pero cuál es el problema con la forma en que funciona ahora, qué problema resolvería para cambiar el comportamiento que describes a la conducta que deseas, qué estás tratando de lograr en el mundo real. –

Respuesta

3

La última solicitud enviada después de realizar NTLM (la que da como resultado una respuesta de 200) contiene un encabezado de autenticación que le dice al servidor que tiene las credenciales correctas.

No estoy seguro de si la clase del cliente tiene la función para mantener esto por sí mismo, pero si encuentra alguna manera de conservar este encabezado y agregarlo a sus solicitudes posteriores, debería funcionar bien.


Actualización: NTLM autentica una conexión, por lo que debe mantener su conexión abierta utilizando el encabezado Keep-Alive. La clase del cliente debe proporcionar algunas configuraciones para esto. Para obtener más información, consulte esta página, que me parece muy útil y clara sobre el esquema de NTLM:

http://www.innovation.ch/personal/ronald/ntlm.html

+0

Hmmm. Es posible configurar el encabezado Authorization en una HttpWebRequest, y lo intenté. Sin embargo, no funcionó: el servidor devuelve 400 Bad Request, lo que indica que el encabezado Authorization no se puede "reproducir" de esta manera. Lo cual supongo que tiene sentido por razones de seguridad. – mackenir

+0

Ver mis ediciones arriba – Iravanchi

+0

Después de hacer un poquito de prueba, parece que, aunque HttpWebRequest tiene una propiedad KeepAlive, que no mejora las cosas más allá de establecer PreAuthenticate = true. Un poco molesto – mackenir

Cuestiones relacionadas