web-dev-qa-db-ja.com

MVC4-404が見つからないことを示すLogOffコントローラーアクション

大学のプロジェクトをまとめているところです。コンピューターを長時間見つめていて、明らかな何かが欠けているかどうかはわかりませんが、ユーザーをログアウトしようとすると、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");
}

ラップトップを壁にぶつける前に、なぜこれが起こっているのか誰かに教えてもらえますか?乾杯。

16
MattSull

リンク(<a/>タグ)を使用してログオフすると、ユーザーがリンクをクリックするとHTTP GETリクエストが発生しますが、アクションは提供するように制限されています[〜#〜] post [〜#〜]リクエストのみ([HttpPost]属性で装飾されているため)。

リンクをフォームに入力してPOSTリクエストを生成するか、アクションから[HttpPost][ValidateAntiForgeryToken](GalacticCowboyのクレジット)を削除する必要があります。

40
THX-1138

ログアウトによってサーバーの状態が変更されるため、[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>

}
34
Dan Hunex

従来のアプリでこの問題が発生しました。私が修正した方法は、提供されたリターンURLが「/ Account/LogOff」であったことを検出し、それに応じて動作することでした。 'AccountController.cs'ファイルから 'Login'メソッド:

if (returnUrl == "/Account/LogOff")
    {
        return this.RedirectToLocal(null);
    }
    else
    {
        return this.RedirectToLocal(returnUrl);  
    }    
0
RRay