Как я могу перенаправить на страницу, когда срок действия сеанса пользователя истек?

В настоящее время я работаю над веб-приложением, использующим платформу ASP.NET 2.0. Мне нужно перенаправить на определенную страницу, скажем, SessionExpired.aspx, когда срок действия сеанса пользователя истекает. Страниц в проекте очень много, поэтому добавлять код на каждую страницу сайта — не совсем удачное решение. Однако у меня есть MasterPages, которые, я думаю, могут помочь.

Спасибо!


person Fede F    schedule 26.09.2008    source источник


Ответы (11)


Вы можете обработать это в global.asax в событии Session_Start. Вы можете проверить файл cookie сеанса в запросе. Если файл cookie сеанса существует, срок действия сеанса истек:

   public void Session_OnStart()
    {
        if (HttpContext.Current.Request.Cookies.Contains("ASP.NET_SessionId") != null)
        {
            HttpContext.Current.Response.Redirect("SessionTimeout.aspx")
        }

    }

Увы, я не нашел элегантного способа узнать имя файла cookie сеанса.

person csgero    schedule 26.09.2008
comment
Я принял этот ответ, потому что ключом к определению просроченного сеанса является проверка существования файла cookie сеанса при работе с новым сеансом. - person Fede F; 26.09.2008
comment
К сожалению, нет хорошего способа получить имя файла cookie сеанса, потому что вы не можете сделать Session.CookieName, как вы можете с FormsAuthneticationTicket. Лучшая рекомендация, которую я нашел, — просто иметь ключ/значение appSetting, которое будет содержать имя файла cookie сеанса. Таким образом, вы будете устанавливать его дважды, что никому не нравится делать, но кажется наиболее удобным способом сделать это. Просто мои два цента. - person dyslexicanaboko; 22.12.2011

Обычно я добавляю элемент управления HtmlMeta в коллекцию Page.Header.Controls на главной странице, когда пользователь «вошел в систему». Установите для него значение «Обновить» на странице SessionExpired.aspx с соответствующей продолжительностью времени ожидания, и все готово.

person Pseudo Masochist    schedule 26.09.2008
comment
Что делать, если срок действия сеанса истекает по любой другой причине, кроме тайм-аута? Это возможно? - person Fede F; 26.09.2008
comment
Истечение подразумевает тайм-аут. Вы можете потерять сеанс программно (Session.Abandon()) или если пользователь подделал или удалил свой файл cookie сеанса, но в этот момент сеанс на самом деле не истек, как таковой. Может я не до конца разбираюсь в вопросе... - person Pseudo Masochist; 26.09.2008
comment
Что, если пользователь проводит много времени на одной и той же странице, выполняя действия, использующие ajax, а не стандартные методы GET/POST? с этим методом они все еще потенциально могут выйти из системы. - person DavidWainwright; 27.01.2012

Если я правильно понимаю, "Session_End" срабатывает внутри и не имеет связанного с ним HTTP-контекста:

http://forums.asp.net/t/1271309.aspx

Поэтому я не думаю, что вы могли бы использовать его для перенаправления пользователя. Я видел, как другие предлагают использовать событие "Session_OnStart()" в файле global.ascx:

http://forums.asp.net/p/1083259/1606991.aspx

Я не пробовал, но вам может подойти следующий код в "global.ascx":

void Session_OnStart() {
    if (Session.IsNewSession == false )
    {
    }
    else 
    {
        Server.Transfer("SessionExpired.aspx", False);
    }
}
person Gabe Sumner    schedule 26.09.2008

Мы используем аутентификацию с помощью форм и вызываем этот метод в методе Page_Load.

private bool IsValidSession()
    {
        bool isValidSession = true;
        if (Context.Session != null)
        {
            if (Session.IsNewSession)
            {
                string cookieHeader = Request.Headers["Cookie"];
                if ((null != cookieHeader) && (cookieHeader.IndexOf("ASP.NET_SessionId") >= 0))
                {
                    isValidSession = false;
                    if (User.Identity.IsAuthenticated)
                        FormsAuthentication.SignOut();
                    FormsAuthentication.RedirectToLoginPage();
                }
            }
        }
        return isValidSession;
    }
person CSharpAtl    schedule 26.09.2008

Другой способ - указать браузеру перенаправить себя (через javascript) через определенное время... но это всегда может быть деактивировано пользователем.

person Pablo Marambio    schedule 26.09.2008

Вы не можете перенаправить пользователя по истечении срока действия сеанса, потому что нет запроса браузера на перенаправление:

  • Если пользователь посещает ваш сайт в течение времени ожидания сеанса (по умолчанию 20 минут), сеанс не завершен, поэтому вам не нужно перенаправлять его.
  • Если пользователь посещает ваш сайт после истечения времени сеанса, сеанс уже завершен. Это означает, что они будут в контексте нового сеанса — Session_OnEnd уже будет запущен для старого сеанса, и вместо этого вы получите Session_OnStart для нового сеанса.

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

Очевидно, вы все еще можете использовать Session_OnEnd для очистки на стороне сервера — это просто взаимодействие с клиентом, которое вам недоступно.

person Simon Forrest    schedule 26.09.2008

Вы помещаете что-то в объект Session, что всегда должно быть там? Другими словами, если они входят в систему, вы можете указать что-то вроде UserID в сеансе.

Session("UserID") = 1234

Итак, если это так, вы можете добавить что-то в свой код на главной странице, который проверяет это значение. Что-то вроде этого:

Dim UserID As Integer = 0
Integer.TryParse(Session("UserID"), UserID)

If UserID = 0 Then
  Response.Redirect("/sessionExpired.aspx")
End If
person Micky McQuade    schedule 26.09.2008
comment
Мммм... это почти работает. Но у меня есть одна проблема. Пользователи не входят в систему. Вместо этого используется аутентификация Windows. В любом случае, я использую это решение с перенаправлением на главную страницу, пока не найду окончательное решение. - person Fede F; 26.09.2008

Вы также можете проверить решения, представленные по ссылке ниже.

Обнаружение времени ожидания сеанса и перенаправление на страницу входа в ASP.NET

person Avdhoota    schedule 27.04.2020

Добавьте или обновите файл Web.Config, включив в него это или что-то подобное:

<customErrors defaultRedirect="url" mode="RemoteOnly">
    <error statusCode="408" redirect="~/SessionExpired.aspx"/>
</customErrors>
person wprl    schedule 26.09.2008

Вы хотите перенаправить на следующий запрос или перенаправить немедленно, без вмешательства пользователя? Если вы хотите перенаправить без вмешательства пользователя, вы можете использовать ClientScript.RegisterStartupScript на своей главной странице, чтобы внедрить фрагмент javascript, который будет перенаправлять ваших клиентов по истечении срока их сеанса.

    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    String timeoutPage = "SessionExpired.aspx"; // your page here
    int timeoutPeriod = Session.Timeout * 60 * 1000;

    sb.AppendFormat("setTimeout(\"location.href = {0};\",{1});", timeoutPage, timeoutPeriod);
    Page.ClientScript.RegisterStartupScript(this.GetType(), "timeourRedirect", sb.ToString(), true);
person Jeremy Frey    schedule 26.09.2008

Код отсюда

namespace PAB.WebControls

{используя Систему; используя System.ComponentModel; с помощью System.Web; с помощью System.Web.Security; с помощью System.Web.UI;

[DefaultProperty("Text"),

    ToolboxData("<{0}:SessionTimeoutControl runat=server></{0}:SessionTimeoutControl>")]

public class SessionTimeoutControl : Control
{
    private string _redirectUrl;

    [Bindable(true),
        Category("Appearance"),
        DefaultValue("")]
    public string RedirectUrl
    {
        get { return _redirectUrl; }

        set { _redirectUrl = value; }
    }

    public override bool Visible
    {
        get { return false; }

    }

    public override bool EnableViewState
    {
        get { return false; }
    }

    protected override void Render(HtmlTextWriter writer)
    {
        if (HttpContext.Current == null)

            writer.Write("[ *** SessionTimeout: " + this.ID + " *** ]");

        base.Render(writer);
    }


    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        if (this._redirectUrl == null)

            throw new InvalidOperationException("RedirectUrl Property Not Set.");

        if (Context.Session != null)
        {
            if (Context.Session.IsNewSession)
            {
                string sCookieHeader = Page.Request.Headers["Cookie"];

                if ((null != sCookieHeader) && (sCookieHeader.IndexOf("ASP.NET_SessionId") >= 0))
                {
                    if (Page.Request.IsAuthenticated)
                    {
                        FormsAuthentication.SignOut();
                    }

                    Page.Response.Redirect(this._redirectUrl);
                }
            }
        }
    }
}

}

person TheEmirOfGroofunkistan    schedule 14.10.2008