Как я могу обработать исключения тайм-аута проверки подлинности форм в ASP.NET? - PullRequest
10 голосов
/ 28 сентября 2011

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

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

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

ОБНОВЛЕНИЕ: Я только что изменил заголовок вопроса: время ожидания проверки подлинности формы, а не время ожидания начальной сессии.Спасибо, что сообщили мне об этой разнице.

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

Ответы [ 3 ]

10 голосов
/ 28 сентября 2011

Вот почему многие системы включают таймеры на странице для указания приблизительного времени ожидания. Это сложно с интерактивными страницами. Вам действительно нужно перехватить функции 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

Редактировать то, что требуется, для форм таймаутов, а не сеансов. Тайм-ауты аутентификации форм работают в другом масштабе, чем тайм-ауты сеансов. Таймауты сессии обновляются при каждом запросе. Билеты на аутентификацию форм фактически не обновляются, пока не пройдет половина времени. Таким образом, если для тайм-аута установлено значение часа и отправлено в одном запросе 25 минут, сеанс сбрасывается на тайм-аут часа, тикет проверки подлинности форм не затрагивается и истекает через 35 минут! Чтобы обойти это, синхронизируйте время ожидания сеанса и билет авторизации форм. Таким образом, вы все еще можете просто проверить время ожидания сеанса. Если вам это не нравится, все равно - сделайте следующее и синхронизируйте тайм-ауты, а затем проанализируйте аутентификационный тикет и прочитайте его тайм-аут. Вы можете сделать это с помощью 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;
                        }
                    }
                }
            }
        }

1 голос
/ 28 сентября 2011

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

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

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

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
    }
}
0 голосов
/ 28 сентября 2011

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

protected void Page_Load(object sender, EventArgs e)
{
    if (Session.IsNewSession)
    {
        //do whatever you need to do
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...