Вновь созданный сеанс не сохраняет содержимое сеанса - PullRequest
0 голосов
/ 03 августа 2011

Система, над которой я работаю, не использует стандартные средства аутентификации / членства ASP.NET для входа / выхода пользователей.Поэтому после входа пользователя в систему я хочу выдать новый идентификатор сеанса для пользователя, чтобы предотвратить перехват / перехват сеанса.У меня проблема в том, что, хотя я смог успешно создать новый сеанс с новым идентификатором и скопировать различные компоненты во вновь созданный сеанс, например.сессия [ "значение"].К концу приведенного ниже фрагмента кода вновь созданный сеанс является текущим сеансом HTTPContext и содержит значения сеанса, которые были скопированы.Однако после выполнения Response.Redirect новый сеанс находится в действии, но ни одно из сеансов ["значений"] не сохранилось между двумя запросами.Как вы можете видеть из приведенного ниже кода, я попытался добавить значения ко многим коллекциям, чтобы они были полезны.Заранее спасибо

    bool IsAdded = false;
    bool IsRedirect = false;

    HttpSessionState state = HttpContext.Current.Session;        
    SessionIDManager manager = new SessionIDManager();
    HttpStaticObjectsCollection staticObjects = SessionStateUtility.GetSessionStaticObjects(HttpContext.Current);
    SessionStateItemCollection items = new SessionStateItemCollection();

    foreach (string item in HttpContext.Current.Session.Contents)
    {
        var a = HttpContext.Current.Session.Contents[item];
        items[item] = a;
    }  

    HttpSessionStateContainer newSession = new HttpSessionStateContainer(
                                                    manager.CreateSessionID(HttpContext.Current),
                                                    items,
                                                    staticObjects,
                                                    state.Timeout,
                                                    true,
                                                    state.CookieMode,
                                                    state.Mode,
                                                    state.IsReadOnly);

    foreach (string item in HttpContext.Current.Session.Contents)
    {
        var a = HttpContext.Current.Session.Contents[item];
        newSession.Add(item,a);
    }



    SessionStateUtility.RemoveHttpSessionStateFromContext(HttpContext.Current);

    SessionStateUtility.AddHttpSessionStateToContext(HttpContext.Current, newSession);

    manager.RemoveSessionID(HttpContext.Current);
    manager.SaveSessionID(HttpContext.Current, newSession.SessionID, out IsRedirect, out IsAdded);

    return newSession.SessionID;

Ответы [ 2 ]

0 голосов
/ 04 августа 2011

Похоже, что это невозможно, так как вы можете добавить переменные сеанса только после того, как один и тот же клиент отправился туда и обратно, чтобы создать соответствующий файл cookie сеанса. Поэтому мне пришлось создать новый новый сеанс (с новым идентификатором), чтобы к моменту добавления переменных сеанса клиентский файл cookie имел соответствующий идентификатор сеанса: раздражает, поскольку в действительности он выдает новый идентификатор сеанса до того, как пользователь прошедшая проверка.

Интересно, что кажется немного странным, что выдача нового идентификатора сеанса - это именно то, что делает стандартная функциональность аутентификации / членства asp.net, но может поддерживать переменные сеанса, но, делая это вручную, не делает .... Есть ли какие-то методы для этого, которые не могут быть представлены нам, разработчикам, возможно ...

0 голосов
/ 03 августа 2011

Может быть, я что-то здесь упускаю, но это не сработает:

Session["mysession"] = mySessionObject;
...