注销按钮在 mvc 应用程序中不起作用

Posted

技术标签:

【中文标题】注销按钮在 mvc 应用程序中不起作用【英文标题】:Log out button not working in mvc application 【发布时间】:2014-08-04 05:20:50 【问题描述】:

我有一个具有不同用户帐户和密码的 MVC 应用程序。登录功能工作正常,但是当我单击注销按钮时,我收到 404 错误提示:

“/”应用程序中的服务器错误。

找不到资源。 说明:HTTP 404。您要查找的资源(或其依赖项之一)可能已被删除、>其名称已更改或暂时不可用。请查看以下 URL 并确保其拼写正确。

请求的 URL:/Account/LogOff

这是退出按钮的代码:

        <div class="navbar-collapse collapse">
            <ul class="nav navbar-nav">
                <li>@html.ActionLink("Log Off", "LogOff", "Account")</li>
                
            </ul>
        </div>

这是 AccountController 中的代码

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    
        Session.Clear();
        FormsAuthentication.SignOut();
        return RedirectToAction("Index", "Home");
    

【问题讨论】:

我相信这是 HttpPost 属性。您是否尝试过删除它。 【参考方案1】:

按照 Microsoft MVC 项目模板,

// Note: Action Name, Controller Name
using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new  id = "logoutForm"))

    @Html.AntiForgeryToken()

    <ul>            
    <li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li>
    </ul>

由于注销需要AntiForgeryToken,因此在 get 方法中是不允许的。您必须使用 POST 方法。

RedirectToAction 不能用于 post 方法。

【讨论】:

【参考方案2】:

只需添加@Stijn 给出的答案:ActionLink 向服务器发送 get 请求,而您的 LogOff Action 需要一个 post 请求,其中包含 AntiForgeryToken

您需要创建一个表单,带有这样的提交按钮:

 @using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new  role = "form" ))
 
     @Html.AntiForgeryToken()
     <input type="submit" value="Logout" class="btn btn-primary"/>
 

这将影响您在帐户控制器中的 LogOff 操作:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()

    AuthenticationManager.SignOut(
        DefaultAuthenticationTypes.ApplicationCookie);
    return RedirectToAction("Index", "Home");

【讨论】:

【参考方案3】:

Html.ActionLink 呈现常规超链接,这会导致 GET 请求。

您的LogOff 具有HttpPost 属性,这意味着它只会响应POST 请求。删除该属性,您的操作将起作用。 ValidateAntiForgeryToken 也不需要,它用于表单。


注意:我不再坚持我原来的答案。虽然它解决了手头的问题,但由于browser prefetching 和potential malicious behaviour,注销实际上应该是一个POST。因此,不应使用超链接,而应有一个带有超链接样式的提交按钮的表单。

【讨论】:

您发布的更新是很好的信息。【参考方案4】:

我遇到了同样的问题,我通过创建一个隐藏的表单来处理它,然后单击“注销”链接,它会提交表单。像这样

<form method="post" action="@Url.Action("LogOff", "Account")" id="signoutfrm" style="display:none;">
@Html.AntiForgeryToken()
</form>

<a href="" onclick="$('#signoutfrm').submit(); return false;">LOGOUT</a>

效果很好

【讨论】:

以上是关于注销按钮在 mvc 应用程序中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

@Html.ActionLink 在 mvc-5 中不起作用

Instagram注销在iPhone中不起作用?

Firebase 注销在颤振应用程序中不起作用

Oracle 的 WDB_GATEWAY_LOGOUT 在 mozilla 浏览器中不起作用

注销按钮操作不起作用

如何用passport-saml修复SLO,它在第一次注销时有效,但在以后的注销中不起作用