Избегайте потери пользовательского ввода PostBack после истечения времени ожидания сеанса аутентификации в ASP.NET - PullRequest
3 голосов
/ 14 ноября 2008

У меня есть форма, которая находится за аутентификацией форм ASP.NET. Пока что реализация следует типичной конфигурации типа «из коробки».

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

Какой подход я должен предпринять, чтобы предотвратить неприятное событие, когда длинное сообщение теряется?

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

Ответы [ 4 ]

1 голос
/ 14 ноября 2008

См. Этот связанный вопрос , где все ответы в значительной степени связаны с одной и той же концепцией сохранения значений после входа в систему:

  • Страница входа ПРЕДСТАВЛЯЕТ имя пользователя, пароль и предыдущие переменные POST к странице перехода. Ссылающаяся страница входит в систему пользователя и выполняет действие.
  • Страница входа записывает переменные формы, а Javascript отправляет ссылку на страницу после успешного входа
  • AJAX логин

Если вам все равно, вошли ли они в систему или нет, когда они отправляют POST (мне это кажется немного сомнительным с точки зрения безопасности ...), то перехват HttpContext.PostAuthenticateRequest в модуле IHttpModule даст вам возможность повторно войти в систему с помощью FormsAuthentication.SetAuthCookie. Событие FormsAuthenticationModule.Authenticate можно использовать аналогичным образом, установив HttpContext.User:

// Global.asax
void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs e) {
   // check for postback somehow
   if (Request.Url == "MyPage.aspx" && Request.Form["MySuperSecret"] == "123") {
      e.User = new GenericPrincipal(new GenericIdentity(), new string[] { });
   }
}
1 голос
/ 14 ноября 2008

Мой коллега придумал общее решение такой проблемы с помощью HttpModule.

Имейте в виду, что он решил обработать свою собственную аутентификацию в этом конкретном приложении.

Вот так:

Он создал HttpModule, который обнаруживал, когда пользователь больше не входил в систему. Если пользователь больше не входил в систему, он брал ViewState этой страницы вместе со всеми переменными формы и сохранял его в коллекции. После этого пользователь перенаправляется на страницу входа с переменными формы предыдущей страницы и информацией ViewState, закодированной в скрытом поле.

После успешной повторной аутентификации пользователя выполняется проверка скрытого поля. Если это скрытое поле доступно, HTML-форма заполняется переменными формы старого сообщения и viewstate. Затем был использован Javascript для автоматической отправки этой формы на сервер.

0 голосов
/ 16 ноября 2008

Я обработал это один раз, добавив значение формы в базу данных, идентифицированное удаленным IP-адресом вместо идентификатора пользователя.

( HttpContext.Request.UserHostAddress )

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

Michael

0 голосов
/ 16 ноября 2008

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

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

...