Como resultado de una prueba de penetración en contra de algunos de nuestros productos en la tubería, lo que parecía ser en ese momento un problema "fácil" de arreglar está resultando ser una Duro.Generando una nueva sesión de ASP.NET en el HTTPContext actual
Claro que no debería ser, por supuesto, ¿por qué simplemente generar una nueva sesión para el actual HTTPContext
ser tan difícil? ¡Extraño! Todos modos- He escrito un poco de clase descarada utilidad para "just do it":
(disculpas para el formato de código/relieve/Visual Basic I debo estar haciendo algo mal)
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
Funciona está bien para el resto de la solicitud, y se identifica correctamente como la nueva sesión (por ejemplo, HTTPContext.Current.Session.SessionID
devuelve el identificador de sesión recién generado).
Sorpresa sorpresa entonces, que cuando la próxima petición acierta en el servidor, el HTTPContext.Session
(un objeto HTTPSessionState
) se identifica con el correcto SessionID
, pero tiene IsNewSession
conjunto de True
y esté vacía, perdiendo todos los valores de sesión definido en el solicitud previa
Debe haber algo especial sobre el objeto HTTPSessionState
anterior que se elimina de la solicitud inicial, un controlador de eventos aquí, una devolución de llamada allí, algo que maneja la persistencia de los datos de la sesión entre solicitudes o simplemente algo que me falta.
¿Alguien tiene magia para compartir?
Desarrollé mi clase 'SwitchSession' dándole un poco de estado (la sesión de 'reemplazo') y cableando eventos' SessionStateModule' para la instancia de la aplicación ASP.NET activa. Cuando el evento 'Start' se activa, comprueba si la sesión generada de ASP.NET tiene el mismo' SessionID' y copia todos los valores de estado de la sesión de la solicitud anterior. Obviamente, solo funciona si todas las solicitudes provienen de la instancia 'HTTPApplication' que manejó la solicitud anterior. Estoy usando un reflector para profundizar un poco más en el 'SessionStateModule', pero no es bonito. Por favor vote esta pregunta! – Rabid
Llegué al mismo lugar que usted (llegó a su página haciendo una búsqueda de RemoveHttpSessionStateFromContext). Lamentablemente, también golpeó la misma pared que usted: parece que no se puede generar una nueva sesión. La clave es, por supuesto, SessionStateModule.CompleteAcquiredState(), que es extremadamente difícil de conseguir, el enfoque de reflexión de Yudhi sería una forma de llegar a él, pero no estoy seguro de que valga la pena. Debo decir que, por mucho que me guste C#, la API de .NET ha sido una gran decepción, ¡cómo no pueden exponer esto! – marq
FYI: CompleteAcquiredState() llama a SessionStateUtility.AddDelayedHttpSessionStateToContext(), que hace toda la magia de una nueva sesión. – marq