Generazione di una nuova sessione ASP.NET nell’attuale HTTPContext

Come risultato di un test di penetrazione contro alcuni dei nostri prodotti in cantiere, quello che sembrava essere al momento un problema “facile” da risolvere si sta rivelando un duro.

Non che dovrebbe ovviamente, voglio dire, perché creare una nuova sessione per l’attuale HTTPContext sarebbe così difficile? Bizzarro! Ad ogni modo, ho scritto una piccola class di utilità sfacciata per “farlo e basta”:

(scuse per la formattazione del codice / evidenziazione / Visual Basic devo fare qualcosa di sbagliato)

 Imports System.Web Imports System.Web.SessionState Public Class SwitchSession Public Shared Sub SetNewSession(ByVal context As HttpContext) ' This value will hold the ID managers action to creating a response cookie Dim cookieAdded As Boolean ' We use the current session state as a template Dim state As HttpSessionState = context.Session ' We use the default ID manager to generate a new session id Dim idManager As New SessionIDManager() ' We also start with a new, fresh blank state item collection Dim items As New SessionStateItemCollection() ' Static objects are extracted from the current session context Dim staticObjects As HttpStaticObjectsCollection = _ SessionStateUtility.GetSessionStaticObjects(context) ' We construct the replacement session for the current, some parameters are new, others are taken from previous session Dim replacement As New HttpSessionStateContainer( _ idManager.CreateSessionID(context), _ items, _ staticObjects, _ state.Timeout, _ True, _ state.CookieMode, _ state.Mode, _ state.IsReadOnly) ' Finally we strip the current session state from the current context SessionStateUtility.RemoveHttpSessionStateFromContext(context) ' Then we replace the assign the active session state using the replacement we just constructed SessionStateUtility.AddHttpSessionStateToContext(context, replacement) ' Make sure we clean out the responses of any other inteferring cookies idManager.RemoveSessionID(context) ' Save our new cookie session identifier to the response idManager.SaveSessionID(context, replacement.SessionID, False, cookieAdded) End Sub End Class 

Funziona perfettamente per il resto della richiesta e si identifica correttamente come nuova sessione (ad esempio, HTTPContext.Current.Session.SessionID restituisce l’identificatore di sessione appena generato).

Sorpresa sorpresa quindi che quando la richiesta successiva colpisce il server, HTTPContext.Session (un object HTTPSessionState ) si identifica con il SessionID corretto, ma ha IsNewSession impostato su True ed è vuoto, perdendo tutti i valori di sessione impostati nella richiesta precedente .

Quindi deve esserci qualcosa di speciale sul precedente object HTTPSessionState che viene rimosso dalla richiesta iniziale, un gestore di eventi qui, una richiamata lì, qualcosa che gestisce la persistenza dei dati di sessione attraverso le richieste o solo qualcosa che mi manca?

Qualcuno ha qualche magia da condividere?