Web ページで、ユーザーが認証のためにクリックできるハイパーリンク (GET) を提供します。
@Html.ActionLink("Please Login", "MyMethod", "MyController")
これは、ビューを返す次のコントローラー メソッドにマップされます。
[RequireHttps]
public ActionResult MyMethod()
{
return this.View(new MyModel());
}
このビューには、ユーザーが資格情報を提供するフォームが含まれています。フォームには、必要な AntiForgeryToken が含まれています。
ユーザーがフォームを送信すると、次の Controller メソッドが呼び出されます。
[HttpPost]
[RequireHttps]
[ValidateAntiForgeryToken]
public ActionResult MyMethod(MyModel model)
{
// my logic
}
ほとんどの場合、これは完全にうまく機能します...
ただし、ユーザーがブラウザを「かなりの」時間開いたままにしてから、次の手順を立て続けに実行した場合:
- ハイパーリンク (GET) をクリックして、ログイン フォームを読み込みます。
- フォームに入力して送信します
偽造防止トークンが提供されなかったか、無効であったことを通知する例外が発生します。
これが事実である理由がわかりません。ブラウザーが休止状態になった後にビュー (フォームを含む) が作成されるため、偽造防止トークンはすべて「新鮮」である必要があります。ただし、この設計には明らかに問題がありますが、それを修正する最善の方法がわかりません。
何か提案があれば、事前に感謝します。
グリフ