web-dev-qa-db-ja.com

MVC 4が提供する偽造防止トークンはユーザー「」向けでしたが、現在のユーザーは「user」です

最近、LiveにMVC 4およびEntity Framework 5を使用して構築されたWebアプリケーションを配置しました。 [〜#〜] mvc [〜#〜]アプリケーションはRazor Viewsを使用します。

Elmahを使用すると、ユーザーがアプリケーションにログインしているときに、次のエラーが発生することがあることに気付きました

The provided anti-forgery token was meant for user "" but the current user is "user"

この問題を修正する方法についてはすでに少し調査を行っていますが、私には何もうまくいかないようです。 ログインビューおよび対応するコントローラーアクションを参照してください。

カミソリビュー

@if (!HttpContext.Current.User.Identity.IsAuthenticated)
{

using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

     <div class="formEl_a">

        <fieldset>
            <legend>Login Information</legend>

            <div class="lbl_a">
                Email
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.Email, new { @class = "inpt_a" })<br />
                @Html.ValidationMessageFor(m => m.Email)
            </div>

            <div class="lbl_a">
                @Html.LabelFor(m => m.Password)
            </div>
            <div class="editor-field sepH_b">
                @Html.PasswordFor(m => m.Password, new { @class = "inpt_a" })<br />
                @Html.ValidationMessageFor(m => m.Password)
            </div>


        </fieldset>
    </div>
    <br />
      <p>
            <input type="submit" value="Log In" class="btn btn_d sepV_a" />
        </p>

}    
}

コントローラー

[AllowAnonymous]
public ActionResult Login()
{
     return View();
}

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
     if (ModelState.IsValid && _accountService.Logon(model.Email, model.Password, true))
     {
          //Validate
     }
     else
     {
          // inform of failed login
      }

}

これはすべて問題ないと思われましたが、それでもエラーは続きます。この問題を解決する方法についてのアイデアはありますか?

あなたの助けは大歓迎です。

ありがとう。

18
tcode

ユーザーがフォームの送信ボタンをダブルクリックしているため、これが発生していると思います。少なくとも私のサイトではまさにそうです。

偽造防止トークンの問題のトラブルシューティング

17
ganders

AntiForgeryTokenに対して実行される検証コードは、ログインしているユーザーの資格情報が変更されていないことも確認します。これらもCookieで暗号化されます。これは、ポップアップまたは別のブラウザタブでログインまたはログアウトした場合、フォームの送信が次の例外で失敗することを意味します。

System.Web.Mvc.HttpAntiForgeryException (0x80004005):
The provided anti-forgery token was meant for user "", but the current user is "SomeOne".

AntiForgeryConfig.SuppressIdentityHeuristicChecks = true;ファイル内のApplication_StartメソッドにGlobal.asaxを入れることでこれをオフにできます。

AntiForgeryTokenが検証しない場合、ウェブサイトはSystem.Web.Mvc.HttpAntiForgeryExceptionタイプの例外をスローします。少なくともHttpAntiForgeryExceptionをキャッチすることで、これらの例外を対象としたより有益なページをユーザーに提供することで、これを少し簡単にすることができます。

private void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();

    if (ex is HttpAntiForgeryException)
    {
        Response.Clear();
        Server.ClearError(); //make sure you log the exception first
        Response.Redirect("/error/antiforgery", true);
    }
}

より詳しい情報:

偽造防止トークンはユーザー「」用ですが、現在のユーザーは「ユーザー名」です

Html.AntiForgeryToken –使いやすさとセキュリティのバランス

11

私は同じ問題を抱えていました

  • ユーザーログイン
  • 次に、ホームページで「戻る」ボタンを押してログインに戻ります
  • ユーザーは別のユーザーとしてログインします
  • これにより例外が発生しました。提供された偽造防止トークンはユーザー「」を対象としていましたが、現在のユーザーは「user」です

これはIEでのみ発生していることを発見し、いくつかのことを行って修正しました

  1. デバッグモードで[戻る]ボタンを押してもログインページへの新しい要求が生成されないことがわかったため、ログインページの出力キャッシュを無効にしました。
  2. ログインページで、ユーザーが既に認証されているかどうかを確認するチェックを追加し、認証されている場合はユーザーをログアウトし、再度ログインページにリダイレクトします。

    [AllowAnonymous]
    [OutputCache(NoStore=true, Location=System.Web.UI.OutputCacheLocation.None)]
    public ActionResult Login)
    {
        if (HttpContext.Request.IsAuthenticated)
        {
            WebSecurity.Logout();
            Session.Abandon();
            return RedirectToAction("Login");
        }
    
        return View();
    }
    
0
Sandhya