2012-06-20 15 views
22

Estoy intentando acceder a una página web en el mismo dominio/misma aplicación asp.net, que está protegida por contraseña. Las credenciales son las mismas tanto para la página web que activa esta llamada como para la página web a la que se accede.Página de acceso WebClient con credenciales

Aquí está el código, ¿y no sé por qué siempre termino con un código html de formulario de inicio de sesión?

using (WebClient client = new WebClient()) 
{ 
    client.QueryString.Add("ID", "1040"); //add parameters 
    //client.Credentials = CredentialCache.DefaultCredentials; 
    //I tried to add credentials like this 
    client.Credentials = new NetworkCredential("username", "password"); 

    string htmlCode = client.DownloadString("http://domain.loc/testpage.aspx"); 
} 
+0

¿Por qué no estás redireccionando a esa página? Descargarlo usando el código en el proceso del servidor significa que * no * está usando las mismas credenciales. Si entiendo correctamente, en lugar de que el navegador (con las credenciales del cliente) acceda a la página, un proceso diferente en una máquina diferente (el servidor) es descargarlo y presentarlo al cliente. – shambulator

+0

¿Cómo se proporcionan esas credenciales a la página web? ¿Utiliza Autenticación de formularios? –

+0

@shambulator ¿Qué quiere decir con redirigir a esa página? Estoy tratando de obtener el código html de esa página. – mko

Respuesta

48

Sospecho que la página web a la que intenta acceder utiliza la Autenticación de formularios. Esto significa que deberá proporcionar una cookie de autenticación válida si desea poder acceder a los recursos protegidos. Y para obtener una cookie de autenticación válida, primero deberá autenticarse enviando una solicitud POST a la página LogOn que emite la cookie. Una vez que recupere la cookie, podrá enviarla en solicitudes posteriores sobre recursos protegidos. También debe tener en cuenta que de fábrica WebClient no es compatible con las cookies. Por esta razón se podría escribir una cookie personalizada cuenta del cliente web:

public class CookieAwareWebClient : WebClient 
{ 
    public CookieAwareWebClient() 
    { 
     CookieContainer = new CookieContainer(); 
    } 
    public CookieContainer CookieContainer { get; private set; } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     var request = (HttpWebRequest)base.GetWebRequest(address); 
     request.CookieContainer = CookieContainer; 
     return request; 
    } 
} 

Ahora usted podría utilizar este cliente para disparar las peticiones 2:

using (var client = new CookieAwareWebClient()) 
{ 
    var values = new NameValueCollection 
    { 
     { "username", "john" }, 
     { "password", "secret" }, 
    }; 
    client.UploadValues("http://domain.loc/logon.aspx", values); 

    // If the previous call succeeded we now have a valid authentication cookie 
    // so we could download the protected page 
    string result = client.DownloadString("http://domain.loc/testpage.aspx"); 
} 

Obviamente, debido a la crapiness ViewState de ASP.NET Es posible que deba enviar un par de otros parámetros a lo largo de su solicitud de inicio de sesión. Esto es lo que puede hacer: autenticarse en un navegador web y mirar con FireBug los parámetros exactos y los encabezados que deben enviarse.

+0

La solución se ve bien y limpia. ¿Los nombres para la colección de inicio de sesión deberían ser realmente el nombre de usuario y la contraseña? ¿Y hay una manera diferente para que la aplicación use las credenciales actuales a pesar de que es una autenticación basada en formularios? – mko

+0

@John, no sé si los nombres para iniciar sesión deberían ser un nombre de usuario y contraseña. Eso dependería totalmente de cómo se implemente su página de Inicio de sesión y qué parámetros espera. Y, no, no hay otra forma. Debe obtener una cookie de autenticación de formularios válida y la única forma de obtener dicha cookie es proporcionándole las credenciales correctas a su página de inicio de sesión. Solo esta página (con suerte :-)) emite cookies de autenticación de formularios. El código –

+0

no funciona, pero entiendo la idea e intentaré que funcione. – mko