Ответ 1
Вот почему многие системы включают таймеры на странице, чтобы дать приблизительное время ожидания. Это сложно с интерактивными страницами. Вам действительно нужно подключить ajax-функции и посмотреть код возврата, что немного сложно. Один из вариантов заключается в использовании кода, основанного на следующем, который запускается на ранней стадии жизненного цикла страницы и выполняет перенаправление ajax на страницу входа. В противном случае вы застряли, пытаясь перехватить код возврата из ajax и в asp.net, где ajax выполняется "для вас" (т.е. Не более ручной метод, такой как jQuery), вы теряете эту легкость обнаружения.
для быстрого взлома вы можете попробовать его прямо в pre_init http://forums.asp.net/t/1193501.aspx
Edit то, что требуется, - это тайм-ауты auth, а не тайм-ауты сеанса. Длительность тайм-аутов формы работает в разном масштабе, чем таймауты сеанса. Обновление тайм-аутов сеанса с каждым запросом. Билеты Forms auth фактически не обновляются до половины времени. Поэтому, если у вас есть тайм-ауты, установленные на час, и отправить по одному запросу на 25 минут, сеанс reset до тайм-аута часа, бланк формы auth не тронут и истекает через 35 минут! Чтобы обойти это, синхронизируйте тайм-аут сеанса и билет формы auth. Таким образом, вы можете просто проверить тайм-ауты сеанса. Если вам это не нравится, то все равно - сделайте ниже и синхронизируйте таймауты, а затем проанализируйте билет авторизации и прочитайте его тайм-аут. Вы можете сделать это с помощью FormsAuthentication.Decrypt - см.:
Прочитать файл cookie для проверки подлинности из кода asp.net позади
Обратите внимание, что для этого кода требуется, чтобы при входе вы установили значение сеанса - в этом случае его "UniqueUserId". Также измените путь к странице входа ниже, чтобы соответствовать вашим требованиям.
protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
//Only access session state if it is available
if (Context.Handler is IRequiresSessionState || Context.Handler is IReadOnlySessionState)
{
//If we are authenticated AND we dont have a session here.. redirect to login page.
HttpCookie authenticationCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (authenticationCookie != null)
{
FormsAuthenticationTicket authenticationTicket = FormsAuthentication.Decrypt(authenticationCookie.Value);
if (!authenticationTicket.Expired)
{
if (Session["UniqueUserId"] == null)
{
//This means for some reason the session expired before the authentication ticket. Force a login.
FormsAuthentication.SignOut();
Response.Redirect("Login.aspx", true);
return;
}
}
}
}
}