PDA

View Full Version : [C#] Problema con autenticazione pagina HTML


leonapster
23-03-2008, 22:54
Con questa funzione effettuo il login su un forum phpbb:

private string GetSource()
{

// Prepare the HttpWebRequest to send data to Amazon.com
string url = string.Format("http://sito.it/forum/ucp.php?mode=login");

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8) Gecko/20051111 Firefox/1.5";
request.Method = "POST";
request.Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
request.KeepAlive = true;
request.ContentType = @"application/x-www-form-urlencoded";

// Send the log-in data
string postData =
"username=aaaaa" +
"&password=bbbbbb" +
"&autologin=1" +
"&redirect=index.php" +
"&login=Log In\"";


byte[] postBuffer = System.Text.Encoding.GetEncoding(0).GetBytes(postData);
request.ContentLength = postBuffer.Length;
Stream postDataStream = request.GetRequestStream();

postDataStream.Write(postBuffer, 0, postBuffer.Length);
postDataStream.Close();

// Get the response
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

// Read the response from the stream
Encoding enc = System.Text.Encoding.UTF8;
StreamReader responseStream = new StreamReader(response.GetResponseStream(), enc, true);

string responseHtml = responseStream.ReadToEnd();
response.Close();
responseStream.Close();

return responseHtml;

}

Funziona tutto correttamente, ma le successive pagine che richiedo con la seguente funzione non sono loggate.


private string ottienipagina(string url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader responseStream = new StreamReader(response.GetResponseStream());
String output = responseStream.ReadToEnd();
responseStream.Close();
response.Close();

return output;
}

Come faccio quindi a mantenere attiva la sessione del login? So' che phpbb lascia un cookie, magari potrei usare quello. ma come gestire i cookie?


grazie

leonapster
24-03-2008, 14:26
up

nuovoUtente86
24-03-2008, 14:34
Devi utilizzare le Sessioni.Se fai una ricerca sul forum ne abbiamo parlato giusto qualche giorno fa.

leonapster
24-03-2008, 15:01
Devi utilizzare le Sessioni.Se fai una ricerca sul forum ne abbiamo parlato giusto qualche giorno fa.
Ciao, scusa ma non sono riuscito a trovare nulla. Puoi linkarmi la discussione?

Edit: Sono riuscito a leggere i cookie del responso. Ma dove li devo salvare?

leonapster
25-03-2008, 11:49
Nessuno sa niente?

wizard1993
25-03-2008, 12:25
credo intendesse questo
http://www.hwupgrade.it/forum/showthread.php?t=1706200

tomminno
25-03-2008, 12:37
Devi inizializzare la proprietà CookieContainer di HttpWebRequest, così che nella risposta ti trovi i cookies nella proprietà Cookies, che riutilizzerai nella successiva richiesta.


HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.CookieContainer = new CookieContainer();
...
HttpWebResponse response = (HttpWebResponse) request.GetResponse();
//in response.Cookies hai i cookies

leonapster
26-03-2008, 13:11
credo intendesse questo
http://www.hwupgrade.it/forum/showthread.php?t=1706200
'-.-

Ok sono riuscito a salvare i cookie e a leggerli nella risposta. Ma per utilizzarli nelle successive chiamate come si fa?

tomminno
26-03-2008, 13:18
'-.-

Ok sono riuscito a salvare i cookie e a leggerli nella risposta. Ma per utilizzarli nelle successive chiamate come si fa?

Nello stesso modo della prima chiamata!
Ti salvi i cookie in una variabile e poi imposti request.CookieContainer della successiva chiamata.

leonapster
26-03-2008, 21:05
public string scaricaPagina(string url)
{

url = string.Format(url);

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.CookieContainer = new CookieContainer();

request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8) Gecko/20051111 Firefox/1.5";
request.Method = "POST";
request.Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
request.KeepAlive = true;
request.ContentType = @"application/x-www-form-urlencoded";


// Send the log-in data
string postData =
"username=aaa" +
"&password=bbb" +
"&autologin=1" +
"&redirect=index.php" +
"&login=Log In\"";

try
{
byte[] postBuffer = System.Text.Encoding.GetEncoding(0).GetBytes(postData);
request.ContentLength = postBuffer.Length;
Stream postDataStream = request.GetRequestStream();

postDataStream.Write(postBuffer, 0, postBuffer.Length);
postDataStream.Close();

// Get the response
HttpWebResponse response = (HttpWebResponse)request.GetResponse();


// Read the response from the stream
Encoding enc = System.Text.Encoding.UTF8;
StreamReader responseStream = new StreamReader(response.GetResponseStream(), enc, true);

string responseHtml = responseStream.ReadToEnd();
response.Close();
responseStream.Close();


return responseHtml;



}
catch (Exception)
{
return "errore";
}



}

Dunque i cookie li ricavo da response.cookies. Come faccio per utilizzarli per le successive richieste? Se utilizzo un nuovo metodo (che fa il semplice get del codice html) come accedo al response.cookies di scaricaPagina(), ma soprattuto come faccio per impostargli i cookie con cui aprire la pagina?

grazie mille

leonapster
26-03-2008, 21:20
Sono riuscito a risolvere:


private string ottienipagina(string url, CookieCollection cook)
{

HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);

CookieContainer cc = new CookieContainer();
cc.Add(cook);

request.CookieContainer = cc;

HttpWebResponse response = (HttpWebResponse)request.GetResponse();


StreamReader responseStream = new StreamReader(response.GetResponseStream());
String output = responseStream.ReadToEnd();
responseStream.Close();
response.Close();

return output;
}

grazie a tutti