2010-05-20 15 views
5

Estoy intentando iniciar sesión en una aplicación web desde mi aplicación .net, pero por alguna razón no funciona. Aquí es el código de entrada:HttpWebResponse login

<form action="./process-login.php" method="post"> 
     <table border="0" cellpadding="5" cellspacing="0"> 
     <tr> 
      <td>Username:</td> 
      <td><input type="text" size="20" name="username" value=""></td> 
     </tr> 
     <tr> 
      <td>Password:</td> 
      <td><input type="password" size="20" name="password" value=""></td> 
     </tr> 
     <tr> 
      <td><input type="submit" name="axn" value=Login></td> 
     </tr> 
     </table> 
</form> 

Así es como lo hago desde .net:

string userName = "user"; 
string password = "password"; 

string postData = "username=" + userName; 
      postData += ("&password=" + password); 
      postData += ("&axn=Login"); 

HttpWebRequest loginRequest = (HttpWebRequest) 
       WebRequest.Create("http://server.com/process-login.php"); 

//Added following answer begin 
CookieContainer CC = new CookieContainer(); 
loginRequest.CookieContainer = CC; 
//Added following answer end 

loginRequest.Method = "POST"; 
loginRequest.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*"; 
loginRequest.Headers.Add("Accept-Encoding: gzip,deflate"); 
loginRequest.Headers.Add("Accept-Language: en-us"); 
loginRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)"; 

loginRequest.ContentLength = postData.Length; 
loginRequest.ContentType = "application/x-www-form-urlencoded"; 

loginRequest.Referer = "http://server.com/login.php"; 
loginRequest.KeepAlive = true; 

//Also added 
loginRequest.AllowAutoRedirect = false; 

StreamWriter newStream = new StreamWriter(loginRequest.GetRequestStream()); 
newStream.Write(postData); 
newStream.Close(); 

//No cookie in the collection :-(

//Problem here, after this line loginRequest url's has changed 
//it's gone back to login.php 
HttpWebResponse responseLogin = (HttpWebResponse)loginRequest.GetResponse(); 


StreamReader stIn = new StreamReader(responseLogin.GetResponseStream()); 
string strResponse = stIn.ReadToEnd(); 
stIn.Close(); 

//strResponde contains the login page, still no cookie :-(

me conecto en el uso de mi navegador y comprobado con el violinista esto es lo que me pasa por el cliente:

POST http://server.com/process-login.php HTTP/1.1 
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */* 
Referer: http://server.com/login.php 
Accept-Language: en-us 
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; WOW64; Trident/4.0; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) 
Content-Type: application/x-www-form-urlencoded 
Accept-Encoding: gzip, deflate 
Host: server.com 
Content-Length: 45 
Connection: Keep-Alive 
Pragma: no-cache 

username=username&password=password&axn=Login 

Y en las cabeceras de respuesta me sale:

HTTP/1.1 302 Found 
Date: Thu, 20 May 2010 14:07:36 GMT 
Server: Apache/2.2.3 (Unix) 
Accept-Ranges: bytes 
X-Powered-By: PHP/5.2.0 
Set-Cookie: login=User%7C3142%7CUser+Inc.%7CAll+Orders+Discounted%7C; expires=Thu, 20-May-2010 22:07:36 GMT; domain=server.com 
Set-Cookie: username=deleted; expires=Wed, 20-May-2009 14:07:35 GMT; path=/; domain=server.com 
Set-Cookie: password=deleted; expires=Wed, 20-May-2009 14:07:35 GMT; path=/; domain=server.com 
Location: /index.php 
Content-Length: 0 
Keep-Alive: timeout=15, max=200 
Connection: Keep-Alive 
Content-Type: text/html 

¡La galleta!

¿Qué estoy haciendo mal que no puedo obtener la cookie?

ACTUALIZACIÓN: Añadiendo el código después de la respuesta, ¡ahora puedo obtener la cookie! Abriré otra pregunta porque parece que aún no puedo obtener páginas seguras ...

Respuesta

5

No veo que configure un CookieContainer en la webrequest. ¿Puedes volver a intentar estableciendo eso?

+0

Tienes razón, inicié el CookieContainer y ahora ¡en realidad se llena! – Enriquev

1

Dado que obtiene un 302, la búsqueda webre también solicita automáticamente la siguiente URL. Puede desactivarlo configurando loginRequest.AllowAutoRedirect = false;. Una vez que hagas esto, deberías ver las cookies. Here's the documentation for AllowAutoRedrect.

+0

Hola, agregué loginRequest.AllowAutoRedirect = false; después de loginRequest.KeepAlive = true; Ahora la página no cambia, pero la colección de cookies todavía está vacía ... – Enriquev

Cuestiones relacionadas