ASP.NET MVC - ValidateAntiForgeryToken истекает
На веб-странице мы предоставляем гиперссылку (GET), которую Пользователь может щелкнуть для аутентификации:
@Html.ActionLink("Please Login", "MyMethod", "MyController")
Это отображает следующий метод контроллера, который возвращает вид:
[RequireHttps]
public ActionResult MyMethod()
{
return this.View(new MyModel());
}
Этот вид содержит форму, в которой Пользователь предоставляет свои учетные данные; Форма содержит требуемый файл AntiForgeryToken.
Когда Пользователь отправляет форму, вызывается следующий метод контроллера:
[HttpPost]
[RequireHttps]
[ValidateAntiForgeryToken]
public ActionResult MyMethod(MyModel model)
{
// my logic
}
Это работает отлично, большую часть времени...
Однако, если Пользователь оставляет свой браузер открытым в течение "значительного" периода времени, а затем быстро выполняет следующие шаги:
- Щелчок по гиперссылке (GET) для загрузки формы входа
- Завершает форму и отправляет
Они получают исключение, информирующее их о том, что токен Anti-Forgery был либо не указан, либо был недопустимым.
Я не понимаю, почему это так: вид (содержащий форму) создается после того, как браузер неактивен, и поэтому токены анти-подделки должны быть "свежими". Однако в этом дизайне что-то явно не так, но я не уверен, как лучше его исправить.
Спасибо заранее, если у вас есть предложения.
Griff
Ответы
Ответ 1
Я имею дело с этой же проблемой, и, хотя я понимаю эту проблему, я пока не уверен в лучшем разрешении.
Процесс Anti-ForgeryToken помещает входное значение в форму со вторым значением, сохраненным в cookie RequestVerificationToken. Оба они отправляются на сервер, и если они не совпадают с ошибкой, выдается.
Файл cookie RequestVerficationToken имеет значение истечения, установленное как сеанс. Поэтому, когда пользователь оставляет браузер открытым на странице в течение длительного времени, а затем отправляет, отметка времени файла cookie сравнивается с значением таймаута сеанса на сервере - по умолчанию 20 минут или около того - и превышено, оно удаляется и, следовательно, валидация токена терпит неудачу.
Возможные решения, все из которых имеют потенциальные проблемы;
- Поместите на страницу таймер javascript и обновите его на некоторое значение меньше
чем ваш тайм-аут сеанса.
- Поймать System.Web.Mvc.HttpAntiForgeryException на сервере - и перенаправить
на ту же страницу.
- Увеличьте время ожидания сеанса
- Измените срок действия токена анти-подделки