38

シナリオは次のとおりです。

ログインページがあります。ユーザーが署名すると、ホームアプリケーションページにリダイレクトされます。次に、ユーザーはブラウザの戻るボタンを使用しており、ログインページが表示されています。彼は再度ログインしようとしますが、例外がスローされます。

HttpAntiForgeryException(0x80004005):提供された偽造防止トークンはユーザー ""を対象としていましたが、現在のユーザーは"userName"です。

これはキャッシングに関連していることを私は知っています。必要なすべてのヘッダー(no-cache、no-store、must-revalidateなど)を設定するカスタムNoCacheフィルターを使用して、ログインアクションのブラウザーキャッシュを無効にしました。

  • これはすべてのブラウザで機能するわけではありません
  • 特にSafari(ほとんどの場合モバイル)はそのような設定を完全に無視します

私はハックを作成し、サファリモバイルを強制的に更新しようとしますが、これは私が期待していることではありません。

できるかどうか知りたいのですが:

  • ユーザーに問題が存在することを示さずに例外を処理する(ユーザーに対して完全に透過的)
  • ブラウザのキャッシュに関連するハックが次のバージョンのブラウザで機能しなくなる場合は、この例外なしにユーザーが再度ログインできるようにする 偽造防止トークンのユーザー名を置き換えることで、この問題を防ぎます。
  • ブラウザの動作はそれぞれ異なるため、ブラウザの動作に依存したくありません。

更新1

明確にするために、MVCでエラーを処理する方法を知っています。問題は、この処理エラーが私の問題をまったく解決していないことです。エラー処理の基本的な考え方は、素敵なメッセージを含むカスタムエラーページにリダイレクトすることです。しかし、私はこのエラーが発生するのを防ぎたいのであり、ユーザーに見える方法でそれを処理するのではありません。ハンドルとは、catch make username replaceまたは他の適切なアクションを意味し、ログインを続行します。

更新2

私のために働いている解決策を以下に追加しました。

4

5 に答える 5

5

エラーを処理するアクション フィルターを追加することで、例外を処理できるはずです。

[HandleError(View="AntiForgeryExceptionView", ExceptionType = typeof(HttpAntiForgeryException))]

そのため、web.config でカスタム エラーがオンになっていることを確認してください。

<customErrors mode="On"/>

ハンドル エラーの詳細については、このブログを参照することもできます。

編集MVC4 を使用しており、ブログは MVC3 に関するものであるため、MSDN ライブラリの HandleErrorAttribute を参照することもできますが、バージョンによって実際に違いが生じることはありません。

于 2012-10-22T15:16:15.430 に答える
1

古い質問ですが、今日この問題に遭遇しました。解決方法は、次のようにログオフ アクションにリダイレクトすることでした。

public ActionResult Login(string returnUrl) 
{
    if (WebSecurity.IsAuthenticated)
        return RedirectToAction("LogOff");

    ...
}
于 2015-08-25T07:12:04.110 に答える