Получить сессию, чтобы истечь изящно в ASP.NET - PullRequest
9 голосов
/ 04 февраля 2009

Мне нужен способ сообщить ASP.NET «Завершить текущий сеанс и начать все заново с нового» до / после перенаправления на страницу.

Вот что я пытаюсь сделать:

1) Обнаружение истечения времени сеанса на главной странице (или Global.asax) приложения ASP.NET.

2) Если сеанс истек, перенаправьте пользователя на страницу, сообщающую ему, что его сеанс истек. На этой странице он будет ждать 5 секунд, а затем перенаправлять пользователя на главную страницу приложения, или, в качестве альтернативы, он может щелкнуть ссылку, чтобы попасть туда раньше, если пожелает.

3) Пользователь приходит на главную страницу и снова начинает использовать приложение.

Хорошо, пока у меня есть шаги 1 и 2. У меня есть функция, которая определяет истечение сеанса с помощью свойства IsNewSession и значения cookie идентификатора сеанса ASP.NET. если он обнаруживает истекший сеанс, он перенаправляет, ждет пять секунд, а затем ПЫТАЕТСЯ перейти на главную страницу.

Проблема в том, что когда он пытается перенаправить, он попадает в часть главной страницы, чтобы обнаружить истекший сеанс, и возвращает true. Я попытался вызвать Session.Abandon (), Session.Clear (), даже установив сеанс в NULL, но безуспешно.

Кто-то там уже сталкивался с этой проблемой раньше, поэтому я уверен, что в сообществе найдется хорошее решение. Заранее спасибо.

Ответы [ 5 ]

11 голосов
/ 04 февраля 2009

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

 HttpCookie mycookie = new HttpCookie("ASP.NET_SessionId");
    mycookie.Expires = DateTime.Now.AddDays(-1);
    Response.Cookies.Add(mycookie);
2 голосов
/ 13 октября 2011

Код на главной странице, который определяет истекший сеанс и перенаправления, должен выглядеть следующим образом:

if (Session != null
    && Session.IsNewSession
    && Request.Cookies["ASP.NET_SessionId"] != null
    && Request.Cookies["ASP.NET_SessionId"].Value != "")
{
    Session.Clear();
    Response.Redirect(timeoutPageUrl);
}

Вызов session.Clear () перед перенаправлением гарантирует, что на следующей странице Session.IsNewSession будет иметь значение false.

Также обратите внимание, что я проверяю наличие пустой строки в значении файла cookie ASP.NET_SessionId. Это помогает предотвратить ошибку при выходе из сеанса с истекшим сроком, если вы случайно вызвали Session.Abandon () в процессе выхода. В этом случае убедитесь, что у вас истек срок действия старого файла cookie сеанса как часть процесса выхода из системы:

Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.MinValue;
2 голосов
/ 14 декабря 2010

Для ASP.NET MVC это то, что я делаю с помощью метода действия.

Примечание:

  • Возвращает простое представление без других ресурсов, которые могут случайно воссоздать сеанс.
  • Я возвращаю текущее время и идентификатор сессии, чтобы вы могли проверить, успешно ли выполнено действие

    public ActionResult ExpireSession()
    {
        string sessionId = Session.SessionID;
        Session.Abandon();
        return new ContentResult()
        {
            Content = "Session '" + sessionId + "' abandoned at " + DateTime.Now
        };
    }
    
0 голосов
/ 09 июня 2009

Добавление трюка с cookie работало и для меня следующим образом:

    Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
    ' Code that runs when a new session is started        
    If Session.IsNewSession Then
        'If Not IsNothing(Request.Headers("Cookie")) And Request.Headers("Cookie").IndexOf("ASP.NET_SessionId") >= 0 Then
        If Not IsNothing(Request.Headers("Cookie")) AndAlso Request.Headers("Cookie").IndexOf("ASP.NET_SessionId") >= 0 Then
            'VB code
            Dim MyCookie As HttpCookie = New HttpCookie("ASP.NET_SessionId")
            MyCookie.Expires = System.DateTime.Now.AddDays(-1)
            Response.Cookies.Add(MyCookie)

            'C# code
            'HttpCookie mycookie = new HttpCookie("ASP.NET_SessionId");    
            'mycookie.Expires = DateTime.Now.AddDays(-1);    
            'Response.Cookies.Add(mycookie);

            Response.Redirect("/timeout.aspx")
        End If
    End If       
End Sub
0 голосов
/ 04 февраля 2009

Вы звоните в Session.Abandon на специальной странице "Ваша сессия истекла"? Если так, не надо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...