Как я могу обрабатывать исключения времени ожидания проверки подлинности в ASP.NET?

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

Однако есть случаи, когда пользователь не нажимает ссылки на другие веб-формы. Например: отредактируйте ссылку в gridviews, используя AutoCompleteExtender с текстовыми полями, и приложение пытается получить информацию, и в основном, в каждом случае, когда выполняется обратная передача, и событие автоматически не обрабатывается аутентификацией asp.net.

Каков наилучший способ справиться с этими исключениями?

UPDATE: Я только что изменил заголовок вопроса: время ожидания проверки подлинности, вместо начального таймаута сеанса. Спасибо, что сообщили мне об этой разнице.

ОБНОВЛЕНИЕ: Я только что создал новый вопрос с конкретной проблемой, с которой сталкиваюсь: Как обрабатывать исключение из-за истекшего аутентификационного билета с помощью UpdatePanel?. Удивительно, но я не нашел много информации об этом. Я был бы очень признателен за вашу помощь.

Ответ 1

Вот почему многие системы включают таймеры на странице, чтобы дать приблизительное время ожидания. Это сложно с интерактивными страницами. Вам действительно нужно подключить ajax-функции и посмотреть код возврата, что немного сложно. Один из вариантов заключается в использовании кода, основанного на следующем, который запускается на ранней стадии жизненного цикла страницы и выполняет перенаправление ajax на страницу входа. В противном случае вы застряли, пытаясь перехватить код возврата из ajax и в asp.net, где ajax выполняется "для вас" (т.е. Не более ручной метод, такой как jQuery), вы теряете эту легкость обнаружения.

http://www.eggheadcafe.com/tutorials/aspnet/7262426f-3c65-4c90-b49c-106470f1d22a/build-an-aspnet-session-timeout-redirect-control.aspx

для быстрого взлома вы можете попробовать его прямо в 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;
                        }
                    }
                }
            }
        }

Ответ 2

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

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

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

MyType MyObject
{
    get
    {
        MyType myObject = Session["MySessionKey"] as MyType
        if (myObject == null)
        {
            myObject = ... get data from a backing store
            Session["MySessionKey"] = myObject;  
        }
        return myObject;
    }
    set
    {
        Session["MySessionKey"] = value;
        ... and persist it to backing store if appropriate
    }
}

Ответ 3

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

protected void Page_Load(object sender, EventArgs e)
{
    if (Session.IsNewSession)
    {
        //do whatever you need to do
    }
}