2009-05-29 17 views
7

Mi aplicación ASP.NET 2.0 crea un HTTPWebRequest en un sitio dentro de la intranet de una empresa, que usa autenticación NTLM. Las credenciales son aprobadas para una cuenta de servicio, que se autentica en el dominio con éxito (el registro de seguridad confirma esto)HttpWebRequest autenticado con redireccion, credenciales persistentes?

Parte del código abreviado sigue ..

HttpWebRequest req = WebRequest.Create(queryUrl) as HttpWebRequest; 
NetworkCredential cred = new NetworkCredential(username, 
       pwd, domain); 
req.Credentials = cred; 

HttpWebResponse response = req.GetResponse() as HttpWebResponse; 

Como parte de la solicitud, hay un par de redirecciones (dentro del mismo dominio) a la respuesta final - que se maneja bien en mi máquina dev (Windows 2k)

Cuando esta solicitud se crea desde mi entorno de despliegue (Windows 2k3), obtengo un error 401 no autorizado devuelto desde el sitio, aparentemente después de que se devuelve el primer código de redireccionamiento (301 Movido), y mi objec de solicitud t intenta seguir la redirección.

Básicamente, ¿alguien sabe de algún problema relacionado con las HttpWebRequests autenticadas que siguen las redirecciones?

PS - La solución obvia es simplemente para solicitar la página redireccionada a - pero los administradores encargados del sitio de intranet quieren controlar el uso de mi aplicación mediante la reorientación de mí a través de una página específica.

+0

¿Ha visto su tráfico de red (por ejemplo, con Fiddler) para ver si el cliente está haciendo ningún intento de autenticación de cliente para el objetivo final de la redirección? La falla al autenticarse automáticamente en el servidor redirigido puede ser una medida de seguridad dentro de .NET para prevenir la fuga inadvertida de credenciales. – EricLaw

+0

Estoy enfrentando el mismo problema y todavía no puedo resolver el problema. http: // stackoverflow.com/questions/3562979/making-a-web-request-to-a-web-page-which-requires-windows-authentication –

Respuesta

11

Para HttpWebRequest reutilizar las credenciales a través de los redireccionamientos, necesita usar una caché de credenciales. Si asigna un objeto NetworkCredentials, solo se usará en la primera solicitud.

Aquí se muestra un ejemplo:

HttpWebRequest req = WebRequest.Create(queryUrl) as HttpWebRequest; 
NetworkCredential cred = new NetworkCredential(username, pwd, domain); 
var cache = new CredentialCache {{queryUrl, "Ntlm", cred}}; 
req.Credentials = cache; 
HttpWebResponse response = req.GetResponse() as HttpWebResponse; 
1

Va a depender de cómo su autenticación. el esquema funciona Las credenciales de red solo ayudarán con la parte NTLM de if. Sospecho que el sitio al que intenta acceder también usa autenticación de formularios. Si este es el caso, cuando inicie sesión debe obtener una cookie de autenticación, deberá incluirla en las solicitudes posteriores, p. después de una redirección. Creo que el objeto WebRequest tiene una colección de encabezados que puede usar para guardar la cookie. Puede ser una buena idea usar el violín o el Firebug para ver qué sucede cuando normalmente navegas.

-1

Si está utilizando NTLM, este es el clásico problema de 2 saltos. Funciona en su máquina de desarrollo porque el cliente y el servidor están en la misma caja y las credenciales se pasan a lo sumo una vez (para redireccionar la máquina de destino final, supongo)

Cuando implemente en su entorno prod, hay hay 3 máquinas involucradas. El navegador del cliente pasa las credenciales al servidor1, luego el servidor 1 intenta pasar las credenciales al servidor2, lo que no está permitido. Una solución alternativa es implementar la autenticación Kerberos (un protocolo más estricto) que permitirá que el servidor1 pase las credenciales al servidor2

+0

Gracias Tion, pero no creo que este sea el problema en este caso: el objeto credencial es para una cuenta separada para el usuario que inició sesión en mi aplicación, por lo que solo hay un salto involucrado; debería haberlo mencionado realmente :) Es el hecho de que hay una redirección transparente involucrada en obtener la respuesta del servidor que aparentemente es la problema, si especifico la url final en lugar de la que redirige, todo funciona ... –

Cuestiones relacionadas