MVC 4 - 注销控制器操作返回404未找到错误

17

我刚刚完成了一项大学项目,不确定是否因为长时间盯着电脑而错过了一些显而易见的东西,但是当我尝试注销用户时,URL /Account/LogOff 返回 404 找不到。

我有一个导航栏,根据用户是否登录显示登入/登出:

<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>
在我的帐户控制器中,有一个随Internet模板提供的默认LogOff操作:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
    WebSecurity.Logout();

    return View("Index");
}

有人能告诉我为什么会发生这种情况吗?我都快把我的笔记本扔到墙上了。谢谢。

3个回答

41

当用户点击链接(<a/>标签)以注销时,会产生HTTP GET请求,但您的操作仅受限于服务于POST请求(因为它被装饰为[HttpPost]属性)。

您需要将链接放入表单并生成POST请求,或从操作中删除[HttpPost][ValidateAntiForgeryToken](感谢GalacticCowboy)。


由于它不是表单提交,因此“ValidateAntiForgeryToken”将失败。 - GalacticCowboy
完全超出了我的理解范围。谢谢。 - MattSull
1
不要使用 Get 来注销(logout),因为它会修改服务器状态。 - Dan Hunex
1
@JeanJimenez 没有正确的解决方案。只有在其他选项不正确的情况下,解决方案才能被认为是正确的。 - Cas Bloem
@CasBloem:x * x = 4 => x = 2,x = -2 QED - THX-1138
显示剩余2条评论

34

由于登出修改了服务器状态,我不会移除 [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>

}

非常好的解决方案,易于实现并且解释了问题。谢谢! - Gent

0

我在一个旧版应用程序中遇到了这个问题。我解决它的方法是检测提供的返回网址是否为“/Account/LogOff”,并采取相应的操作。 来自于'AccountController.cs'文件,'Login'方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接