Подтвердить что ты не робот

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

4b9b3361

Ответ 1

Я имею дело с этой же проблемой, и, хотя я понимаю эту проблему, я пока не уверен в лучшем разрешении.

Процесс Anti-ForgeryToken помещает входное значение в форму со вторым значением, сохраненным в cookie RequestVerificationToken. Оба они отправляются на сервер, и если они не совпадают с ошибкой, выдается.

Файл cookie RequestVerficationToken имеет значение истечения, установленное как сеанс. Поэтому, когда пользователь оставляет браузер открытым на странице в течение длительного времени, а затем отправляет, отметка времени файла cookie сравнивается с значением таймаута сеанса на сервере - по умолчанию 20 минут или около того - и превышено, оно удаляется и, следовательно, валидация токена терпит неудачу.

Возможные решения, все из которых имеют потенциальные проблемы;

  • Поместите на страницу таймер javascript и обновите его на некоторое значение меньше чем ваш тайм-аут сеанса.
  • Поймать System.Web.Mvc.HttpAntiForgeryException на сервере - и перенаправить на ту же страницу.
  • Увеличьте время ожидания сеанса
  • Измените срок действия токена анти-подделки