2009-11-16 11 views
5

Ho bisogno di accedere a un sito Web ed eseguire un'azione. Il sito web è il riposo basa in modo da poter facilmente accedere in questo modo (le informazioni di accesso è incluso come un querystring sull'URL, quindi ho dont't necessario impostare le credenziali):C# mantenendo la sessione su HTTPS sul client

CookieContainer cookieJar = new CookieContainer(); 

HttpWebRequest firstRequest = (HttpWebRequest) WebRequest.Create(loginUrl); 
firstRequest.CookieContainer = cookieJar; 
firstRequest.KeepAlive = true; 
firstRequest.Method = "POST"; 
HttpWebResponse firstResponse = (HttpWebResponse)firstRequest.GetResponse(); 

che funziona e mi registra in. Ricevo un cookie per mantenere la sessione ed è memorizzato nel cookieJar mostrato sopra. Quindi faccio una seconda richiesta come questa:

HttpWebRequest secondRequest = (HttpWebRequest) WebRequest.Create(actionUrl); 
secondRequest.Method = "POST"; 
secondRequest.KeepAlive = true; 
secondRequest.CookieContainer = cookieJar; 
WebResponse secondResponse = secondRequest.GetResponse(); 

E assicuro di assegnare i cookie alla nuova richiesta. Ma per qualche ragione questo non sembra funzionare. Ricevo un errore che mi diceva "la mia sessione è scaduta o è scaduta", e questo viene fatto uno dopo l'altro, quindi non è un problema di temporizzazione.

Ho usato Fiddler per esaminare le intestazioni HTTP ma sto trovando così difficile poiché questo è HTTPS. (So ​​che posso decodificarlo ma non sembra funzionare bene.)

Posso prendere i miei URL per questo servizio di restazioni e incollarli in firefox e tutto funziona bene, quindi deve essere qualcosa che sto facendo sbagliato e non l'altra estremità della connessione.

Non ho molta familiarità con HTTPS. Devo fare qualcos'altro per mantenere la mia sessione? Pensavo che sarebbe stato il cookie, ma forse c'è qualcos'altro che devo mantenere tra le due richieste?

Ecco le intestazioni restituite quando invio nella prima richiesta (tranne ho cambiato il cookie per proteggere gli innocenti!):

X-DB-Content-length=19 
Keep-Alive=timeout=15, max=50 
Connection=Keep-Alive 
Transfer-Encoding=chunked 
Content-Type=text/html; charset=WINDOWS-1252 
Date=Mon, 16 Nov 2009 15:26:34 GMT 
Set-Cookie:MyCookie stuff goes here 
Server=Oracle-Application-Server-10g 

Qualsiasi aiuto sarebbe apprezzato, io sono a corto di idee.

risposta

4

ho finalmente capito di lavoro dopo la decodifica del traffico HTTP dal mio programma.

Il cookie che sto ricevendo non elenca la variabile Path. Quindi .NET prende il percorso corrente e lo assegna come il percorso sul cookie, inclusa la pagina corrente. vale a dire: se fosse a http://mysite/somepath/somepage.htm avrebbe impostato il percorso del cookie =/somepath/somepage.htm. Questo è un bug che dovrebbe essere assegnato a "/", che è ciò che fanno tutti i browser web. (spero che risolvono questo problema.)

Dopo aver notato questo, ho preso il cookie e modificato la proprietà del percorso e tutto funziona correttamente ora.

Chiunque abbia un problema come questo controlla Fiddler. .NET utilizza l'archivio dei certificati di Windows in modo da decrittografare il traffico http dal tuo programma e dovrai seguire le istruzioni qui: http://www.fiddler2.com/Fiddler/help/httpsdecryption.asp. Dovrai anche attivare la decrittografia nella scheda Opzioni \ HTTPS di Fiddler.

+0

Microsoft sembra aver risolto questo problema in .NET 4. – Kelly

+0

Ciao Kelly, sto anche affrontando una sessione scaduta che potrebbe essere simile al tuo caso sopra, potresti dare un'occhiata a questo link: http://stackoverflow.com/ domande/22957840/scansione-sessione scaduta Grazie – bluewonder

0

Da MSDN:

Quando un utente si muove avanti e indietro tra le aree protette e pubbliche, il cookie di sessione ASP.NET generati (o URL se è stata abilitata cookie meno lo stato della sessione) si muove con loro in chiaro, ma il cookie di autenticazione non viene mai passato su connessioni HTTP non crittografate a condizione che la proprietà Secure cookie sia impostata su.

Quindi, in sostanza, il cookie può essere trasmesso su HTTP e HTTPS se la proprietà "Protetto" è impostata su "falso".

vedi anche how can I share an asp.net session between http and https

+0

Non capisco. Sono sul client, non sul lato server di questa richiesta. Ho bisogno di mantenere la sessione attraverso due o più chiamate al server, ma anche se sto portando il cookie lungo esso non sembra riconoscere che sto usando la stessa sessione. – Kelly

+0

Era un po 'confuso se si presupponeva che il sito con cui si stava parlando fosse ASP.Net, ma indipendentemente dal suo suggerimento era quello di impostare il cookie che si ottiene dopo la proprietà sicura della prima chiamata su true e vedere se funziona (credo) – John

+0

Ho fatto un tentativo. I cookie sono tornati sicuri = false. Li ho impostati su true per la seconda richiesta, ma ancora senza fortuna. – Kelly

Problemi correlati