我刚刚结束了一个大学项目,我不确定我是否一直盯着我的电脑太长时间并且遗漏了一些显而易见的东西,但是当我尝试将用户注销时,我得到了找不到404 / URL / 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>
在我的帐户控制器中,Internet模板附带的默认LogOff操作:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
WebSecurity.Logout();
return View("Index");
}
有人能告诉我为什么会发生这种情况 - 在我将笔记本电脑靠在墙上之前。欢呼声。
答案 0 :(得分:39)
您使用链接(<a/>
标记)注销,当用户点击该请求时会导致 HTTP GET 请求,但您的操作仅限于提供 POST 仅请求(因为它使用[HttpPost]
属性修饰)。
您需要将链接放入表单并生成POST请求,或者从您的操作中删除[HttpPost]
和[ValidateAntiForgeryToken]
(加入GalacticCowboy)。
答案 1 :(得分:34)
由于logout修改服务器状态,我不会删除[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>
}
答案 2 :(得分:0)
我在遗留应用上遇到了这个问题。我修复它的方法是检测提供的返回Url是&#39; / Account / LogOff&#39;并采取相应行动。 来自&#39; AccountController.cs&#39;文件,&#39;登录&#39;方法:
if (returnUrl == "/Account/LogOff")
{
return this.RedirectToLocal(null);
}
else
{
return this.RedirectToLocal(returnUrl);
}