2010-09-15 12 views
12

Sto scrivendo un codice di registrazione che si basa su SessionID ...SessionID è sempre lo stesso, dopo Session.Abandon chiamata

Tuttavia, quando la sessione (chiamando Session.Abandon), e accedere ancora una volta , SessionID è sempre lo stesso. Fondamentalmente ogni browser sul mio PC ha il proprio ID di sessione "allegato" e non cambierà per qualche motivo:/

Qualche idea su cosa sta succedendo?

mio config sessione si presenta così:

<sessionState 
     mode="InProc" 
     timeout="1" /> 

Grazie, Paweł

+0

Perché si desidera rimuovere l'ID di sessione? Mi aiuterà molto se risponderai alla mia domanda qui: http://stackoverflow.com/questions/37642982/why-not-to-reuse-asp-net-sessionid –

risposta

14

Controllare questo articolo che spiega il processo su Session.Abandon

http://support.microsoft.com/kb/899918

Tratto da link qui sopra -

"Quando si abbandona una sessione, il cookie di sessione ID non viene rimosso dal browser Pertanto, non appena la sessione è stata abbandonata, qualsiasi nuova richiesta alla stessa applicazione utilizzerà lo stesso ID di sessione ma avrà una nuova istanza dello stato di sessione "

+11

Sì. Questo è ciò che devi fare nel tuo codice di disconnessione: Session.Abandon(); Response.Cookies.Add (new HttpCookie ("ASP.NET_SessionId", "")); E in Web.config fai questo: Augis

+0

Qual è il vantaggio dell'eliminazione del cookie? Si prega di dare un'occhiata alla mia domanda qui: http://stackoverflow.com/questions/37642982/why-not-to-reuse-asp-net-sessionid –

5

Questo è un comportamento di default in base alla progettazione, come indicato here:

identificativi di sessione per le sessioni abbandonate o scaduti sono riciclato per impostazione predefinita. Cioè, se viene fatta una richiesta che include l'identificatore di sessione per una sessione scaduta o abbandonata, viene avviata una nuova sessione usando lo stesso identificativo di sessione. È possibile disattivare impostando attributo regenerateExpiredSessionId dell'elemento di configurazione sessionState true

è possibile disattivare questa impostazione come menzionato sopra.

MODIFICA: l'attributo regenerateExpiredSessionId su true funziona solo per le sessioni senza cookie. Per superare il problema, puoi prendere in considerazione l'implementazione di una classe personalizzata che eredita la classe SessionIDManager. È possibile ottenere informazioni su quello here e here.

+0

Grazie. How how http://msdn.microsoft.com/en-us/library/h6bb9cz9%28v=VS.90%29.aspx afferma che il valore predefinito regenerateExpiredSessionId è impostato su true. Ad ogni modo, l'ho fatto ora, imposta regenerateExpiredSessionId = "true" e SessionID è sempre lo stesso. – dragonfly

+0

sì - questo dovrebbe funzionare ma in seguito la documentazione afferma che questo si applica solo alle sessioni senza cookie. Vedere le osservazioni su http://msdn.microsoft.com/en-us/library/system.web.configuration.sessionstatesection.regenerateexpiredsessionid.aspx – VinayC

+0

Oh caro:/Quindi ... c'è un modo per rigenerare SessionID utilizzando NOT cookie- meno sessioni, sono confuso. – dragonfly

0

È possibile cancellare esplicitamente il cookie di sessione. È necessario controllare il nome del cookie tramite configuration e utilizzare lo stesso nome durante la cancellazione.

Modifica: Se si cancella il cookie di sessione quando la sessione viene abbandonata, forzerà ASP.NET a creare una nuova sessione & sessionid per la richiesta successiva. A proposito, un altro modo per cancellare il cookie di sessione è utilizzare il metodo SessionIDManager.RemoveSessionID.

2

Ecco cosa ha funzionato per me, l'unica avvertenza è che questo codice deve essere separato dalla tua routine di accesso.

Response.Cookies("ASP.NET_SessionId").Expires = DateTime.Now.AddYears(-30) 

Non avrà effetto fino a quando la pagina viene terminato il caricamento. Nella mia applicazione ho una semplice routine di sicurezza, che impone un nuovo ID, in questo modo:

if session("UserID") = "" then 
    Response.Cookies("ASP.NET_SessionId").Expires = DateTime.Now.AddYears(-30) 
    Response.Redirect("login.aspx") 
end if 
+0

Ha funzionato come cetriolo :) –

+0

Ho usato il codice seguente, HttpContext.Current.Response.Cookies ["ASP.NET_SessionId"]. Expires = DateTime.Now.AddYears (-30). Ma se si dispone di valori di sessione esistenti, si prega di archiviarli in memoria ed eseguire l'operazione di cui sopra, altrimenti tutti i valori nella sessione verranno cancellati. Anche un punto importante da notare è, come detto da shitburg, che il nuovo ID di sessione viene generato solo sulla ricarica. –

0

Questo è un vecchio post, ma se qualcuno è ancora alla ricerca di risposte, ecco un completo e step-by-step soluzione su come ottenere un logout pulito con un nuovo ID di sessione ogni volta.

Si prega di notare che questo articolo si applica solo ai siti abilitati per cookie (cookieless = false).

Passo (1) Modificare il file web.config & add "regenerateExpiredSessionID" segnala come sotto -

<sessionState mode="InProc" cookieless="false" regenerateExpiredSessionId="true" /> 

Passo (2) Aggiungere il seguente codice nel tuo caso di logout -

Session.Clear(); 
Session.Abandon(); 
Response.Cookies.Add(New HttpCookie("ASP.NET_SessionId", "")); 
Response.redirect(to you login page); 

Passaggio (3) Aggiungere il seguente codice nell'evento page_load della pagina di accesso -

if(!IsPostBack) 
{ 
    Session.Clear(); 
    Session.Abandon(); 
} 

I passaggi 2 e 3 servono uno scopo IMPORTANTE. Questo codice consente di generare un ID sessione nuovo di zecca dopo aver fatto clic sul pulsante "Accedi". Ciò impedisce la gestione deboli della sessione (vulnerabilità della risoluzione di sessione) che verrà probabilmente individuata durante un test di penetrazione di terze parti del sito.

Spero che questo aiuti.

Problemi correlati