大学のプロジェクトをまとめているところです。コンピューターを長時間見つめていて、明らかな何かが欠けているかどうかはわかりませんが、ユーザーをログアウトしようとすると、404が表示されません。 URL/Account/LogOffで見つかりました。
ユーザーがログインしているか、ログインしているか、ログアウトしているかに応じて、ログイン/ログアウトを表示するナビゲーションバーがあります。
<div class="nav-collapse collapse">
<ul class="nav pull-right">
<li class="dropdown" id="dropdown-login-div">
@if (!Request.IsAuthenticated)
{
<a class="dropdown-toggle" href="#" data-toggle="dropdown">Sign In <strong class="caret"></strong></a>
}
else
{
@Html.ActionLink("Log Off", "LogOff", "Account")
}
<div class="dropdown-menu" id="dropdown-login">
@Html.Partial("~/Views/Account/_LoginPartial.cshtml", new ViewDataDictionary<LetLord.Models.LoginModel>())
</div>
</li>
</ul>
</div>
私のアカウントコントローラーでは、インターネットテンプレートに付属するデフォルトのLogOffアクションは次のとおりです。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
WebSecurity.Logout();
return View("Index");
}
ラップトップを壁にぶつける前に、なぜこれが起こっているのか誰かに教えてもらえますか?乾杯。
リンク(<a/>
タグ)を使用してログオフすると、ユーザーがリンクをクリックするとHTTP GETリクエストが発生しますが、アクションは提供するように制限されています[〜#〜] post [〜#〜]リクエストのみ([HttpPost]
属性で装飾されているため)。
リンクをフォームに入力してPOSTリクエストを生成するか、アクションから[HttpPost]
と[ValidateAntiForgeryToken]
(GalacticCowboyのクレジット)を削除する必要があります。
ログアウトによってサーバーの状態が変更されるため、[HttpPost]と[ValidateAntiForgeryToken]を削除せず、代わりにリンク(アンカータグ)を次のように置き換えます。
@using (Html.BeginForm("Log Out", "Account", FormMethod.Post,
new { id = "logoutForm" }))
{
@Html.AntiForgeryToken()
<a href="javascript:document.getElementById('logoutForm').submit()">Log Out</a>
}
従来のアプリでこの問題が発生しました。私が修正した方法は、提供されたリターンURLが「/ Account/LogOff」であったことを検出し、それに応じて動作することでした。 'AccountController.cs'ファイルから 'Login'メソッド:
if (returnUrl == "/Account/LogOff")
{
return this.RedirectToLocal(null);
}
else
{
return this.RedirectToLocal(returnUrl);
}