На веб-странице мы предоставляем гиперссылку (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