最近、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
}
}
これはすべて問題ないと思われましたが、それでもエラーは続きます。この問題を解決する方法についてのアイデアはありますか?
あなたの助けは大歓迎です。
ありがとう。
ユーザーがフォームの送信ボタンをダブルクリックしているため、これが発生していると思います。少なくとも私のサイトではまさにそうです。
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);
}
}
より詳しい情報:
私は同じ問題を抱えていました
これはIEでのみ発生していることを発見し、いくつかのことを行って修正しました
ログインページで、ユーザーが既に認証されているかどうかを確認するチェックを追加し、認証されている場合はユーザーをログアウトし、再度ログインページにリダイレクトします。
[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();
}