В результате теста на проникновение в некоторые из наших продуктов в трубопроводе, то, что казалось в то время "легкой" проблемой для исправления, оказалось сложным.
Не то, чтобы это было, конечно, я имею в виду, почему бы просто создать совершенно новый сеанс для текущего HTTPContext
настолько сложно? Bizarre! Во всяком случае, я написал наглый небольшой класс полезности, чтобы "просто сделать это":
(извинения за форматирование/выделение кода /Visual Basic я должен делать что-то не так)
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
Он отлично работает для остальной части запроса и правильно идентифицирует себя как новый сеанс (например, HTTPContext.Current.Session.SessionID
возвращает вновь сгенерированный идентификатор сеанса).
Сюрприз удивляет то, что когда следующий запрос попадает на сервер, объект HTTPContext.Session
(an HTTPSessionState
) идентифицирует себя с правильным SessionID
, но имеет IsNewSession
установлен на True
и пуст, потеряв все значения сеанса, установленные в предыдущем запросе.
Итак, должно быть что-то особенное относительно предыдущего объекта HTTPSessionState
, удаляемого из первоначального запроса, обработчика события здесь, обратного вызова там, что-то, что обрабатывает сохранение данных сеанса через запросы или просто что-то, что мне не хватает?
У кого-нибудь есть какая-нибудь магия?