2009-09-14 5 views
11

Ho un sito Web che utilizza l'autenticazione e l'appartenenza moduli. Un utente deve avere i cookie abilitati per utilizzare il sito. Mi è stato chiesto di modificare il codice in modo tale che l'ID di sessione venga modificato non appena un utente esegue l'accesso. In questo modo verrà protetto da un attacco di Session Fixation (http://en.wikipedia.org/wiki/Session_fixation). Qualcuno sa come posso modificare l'ID della sessione senza perdere l'intera sessione? PHP ha un metodo specifico per farlo, ma non riesco a trovare un equivalente .NET.come cambiare l'ID di sessione dopo l'accesso in asp.net

risposta

5

Here's a blog post che parla di questo:

ASP.NET non supporta direttamente funzionalità per rigenerare una sessione ID. Vedere la documentazione relativa a il numero here. C'è un not-so quick and dirty way per impostare il valore ASPNET_SessionID su la stringa vuota e il reindirizzamento in modo da che il valore viene rigenerato.

+1

i ASLO pensare a questo, ma dopo rigenerato che, tutto l'oggetto in oggetto sessione perderà ... – MemoryLeak

+1

Il il post sul tuo blog non è più disponibile. –

6

Ho risposto a una domanda simile a Generating a new ASP.NET session in the current HTTPContext. Fondamentalmente dobbiamo modificare alcuni stati interni di SessionStateModule per poter rigenerare l'ID di sessione senza perdere oggetti nella Session. Ho usato reflection per impostare il campo _rqId sul nuovo ID e _rqSessionStateNotFound su true. Il rovescio della medaglia è che dobbiamo concedere "Full Trust" per l'applicazione.

+2

La [risposta accettata] (http://stackoverflow.com/a/1419508/295686) fa riferimento a un articolo indirizzato a .NET 1.1 (e in realtà non risolve la fissazione della sessione, ma solo il vecchio riutilizzo dell'ID di sessione), ma questo la soluzione era più elegante e funzionava nella nostra applicazione .NET 4.5 (un sito MVC e un sito Web Forms). – mlhDev

1

Questa è una domanda davvero Io sto risorgere, ma ecco la soluzione:

var manager = new SessionIDManager(); 
bool redirected, isAdded; 
manager.SaveSessionID(System.Web.HttpContext.Current, 
    "5vonjb4mtb1of2fxvhjvkh5d", out redirected, out isAdded); 

// sessionId now equals "5vonjb4mtb1of2fxvhjvkh5d" 
var sessionId = Session.SessionID; 
+0

Lo so, è passato un po 'di tempo. Ma abbiamo provato il tuo codice e non funziona per noi. sessionId non è uguale a "5vonjb4mtb1of2fxvhjvkh5d". – mosquito87

+0

l'ho fatto con successo. sessionid viene modificato nel nuovo sessionid. – pinopino

+2

Questo ci ha avvicinato ma non abbastanza vicino - ancora lavorando su di esso. Ciò aggiorna l'ID di sessione e invia l'aggiornamento dei cookie esattamente come ci si aspetterebbe, ma ci piacerebbe comunque utilizzare la sessione durante la stessa richiesta. Non siamo in grado di farlo in questo momento - sembra che il sacchetto di sessione sia il precedente; la prossima richiesta vede la nuova sessione ma i nostri valori non ci sono. – mlhDev