MVC 4 - 未找到给出 404 的注销控制器操作

Posted

技术标签:

【中文标题】MVC 4 - 未找到给出 404 的注销控制器操作【英文标题】:MVC 4 - LogOff controller action giving 404 not found 【发布时间】:2013-04-07 21:47:58 【问题描述】:

我刚刚结束了一个大学项目,我不确定我是否一直盯着我的电脑太久而遗漏了一些明显的东西,但是当我尝试注销用户时,我得到了找不到 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 模板附带的默认注销操作:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()

    WebSecurity.Logout();

    return View("Index");

在我把笔记本电脑扔到墙上之前,谁能告诉我为什么会这样。干杯。

【问题讨论】:

【参考方案1】:

您使用链接(&lt;a/&gt; 标记)注销,当用户单击它时会产生 HTTP GET 请求,但您的操作仅限于提供 POST仅请求(因为它用[HttpPost] 属性装饰)。

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

【讨论】:

这是正确的 - 我的建议是删除 HttpPost 而不是创建一个表单来注销。由于您没有向服务器提交任何数据,因此 GET 最适合注销操作。 ValidateAntiForgeryToken 也会失败,因为它不是表单帖子。 完全超出了我的想象。谢谢。 不要使用 Get 注销(注销它会修改服务器状态 @JeanJimenez 没有正确的解决方案。只有当其他选项不正确时,解决方案才能正确。【参考方案2】:

由于注销会修改服务器状态,我不会删除 [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>


【讨论】:

非常好的解决方案老兄,易于实施并解释了问题。谢谢!【参考方案3】:

我在旧版应用上遇到了这个问题。我修复它的方法是检测提供的返回 URL 何时为“/Account/LogOff”并采取相应措施。 从 'AccountController.cs' 文件,'Login' 方法:

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

【讨论】:

以上是关于MVC 4 - 未找到给出 404 的注销控制器操作的主要内容,如果未能解决你的问题,请参考以下文章

简单 MVC RoutePrefix - HTTP 错误 404.0 - 未找到

用 [HttpPost] 装饰时 ASP MVC 控制器操作“未找到 404”错误

ASP.NET MVC 4,Web API - 404 未找到

Spring MVC + Eclipse:HTTP 404 – 未找到

Spring Boot Web 应用程序给出 500 内部服务器错误,而不是 404 未找到

Laravel 版本 - 4.2 注销不起作用