Обнаружение тайм-аута сеанса ASP.Net. Является ли обнаружение Session.IsNewSession и SessionCookie лучшим способом сделать это? - PullRequest
7 голосов
/ 09 января 2009

Когда у меня истекает время сеанса ASP.Net (и также формируется аутентификация), и я пытаюсь перейти на страницу, я автоматически перенаправляюсь на мою страницу login.aspx по умолчанию.

Перед загрузкой страницы мне нужно определить, является ли это ситуацией тайм-аута, и если да, перенаправить на timeout.aspx.

В приведенных ниже статьях указывается, что если IsNewSession имеет значение true и cookie cookie для сеанса существует, у вас возникает ситуация тайм-аута.

Однако в моем тестировании у меня возникла ситуация, когда я тайм-аут и пытаюсь снова войти в систему, и IsNewSession равен true, а cookie sessionId все еще висит (потому что он остается для всей сессии браузера), поэтому он говорит, что я снова истекло время ожидания, когда я просто пытаюсь снова войти в систему.

Есть ли лучший способ сделать все это?

Техника описана здесь и здесь .

В моем файле global.asax у меня есть:

void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
        // Check if session state is enabled in web.config
        if (Context.Session == null) return;

        if (Session["user"] == null) 
        {
            if (Session.IsNewSession)
            {                    
                HttpCookie sessionCookie = Request.Cookies["ASP.NET_SessionId"];
                if ((null != sessionCookie) && !string.IsNullOrEmpty(sessionCookie.Value))
                {
                    /* Session Timeout! */
                    FormsAuthentication.SignOut(); //just in case not done yet
                    Session.Abandon();
                    Response.Redirect("timeout.aspx");
                }
                else
                {
                    // Cookie didn't exist - must be a brand new login
                    return;
                }
            }
            else
            {
                // If there is no session data and the session is not new then it must be the postback of the login screen.
                if ((HttpContext.Current.Request.Path.ToLower().LastIndexOf("/login.aspx") >= 0) && (Request.HttpMethod == "POST"))
                {
                    return;
                }
            }
        }    
}

Ответы [ 2 ]

7 голосов
/ 09 января 2009

Вы пытаетесь различить сеанс тайм-аута и сеанс, который был завершен вручную?

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

Есть два подхода.

Cookie:

Сначала на странице входа в систему вы можете создать дополнительный файл cookie, который указывает статус входа пользователя. Когда пользователь вручную выходит из системы, значение cookie изменяется, чтобы указать выход из системы. Запрос после истечения времени ожидания сеанса, помимо IsNewSession true, будет также иметь файл cookie состояния входа, показывающий, что пользователь все еще вошел в систему, что означает, что пользователь не выбрал выход из системы вручную.

База данных:

Второй подход заключается в сохранении идентификаторов сеансов в таблице БД вместе с состоянием входа в систему. После успешного входа в систему введите sessionID в таблицу LoggedOnSessions. Когда пользователь выходит из системы вручную, удалите sessionID из таблицы. Следовательно, ваше обнаружение тайм-аута может включать в себя поиск идентификатора сеанса в таблице, если это был тайм-аут (в этот момент вам, вероятно, также следует удалить идентификатор).

В целях ведения домашнего хозяйства вы должны включить поле даты истечения срока действия, которое устанавливается намного дольше, чем любой реалистичный период входа в систему (например, неделя). Регулярно (например, еженедельно) удаляйте записи в таблице с истекшим сроком действия.

Я предпочитаю подход с базой данных, я ненавижу устанавливать файлы cookie, потому что меня раздражает, что этот файл cookie отправляется при каждом запросе, но редко требуется.

0 голосов
/ 19 мая 2009

Вы также можете посмотреть файл web.config под тегом аутентификация . Это должно выглядеть примерно так:

<authentication mode="Windows">
  <forms defaultUrl="Default.aspx" loginUrl="Login.aspx" name=".aspxAuth">
  </forms>
</authentication>

Обратите внимание на атрибут mode , он, вероятно, говорит, что в вашем файле web.config вместо форм есть Window. В этом случае, если вы потеряете сеанс, а затем нажмете на любую ссылку (скажем, SalesChart.aspx), ASP.NET перенаправит вас прямо в кодовый блок Login.aspx вместо кода кода SalesChart.aspx, что особенно раздражает.

Если вы попробуете режим Windows, вы будете перенаправлены на запрашиваемую страницу (SalesChart.aspx) каждый раз, а затем самостоятельно решите, какие действия предпринять в случае потери сеанса.

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