我的asp.net MVC 4应用程序中有这个html:
@if (User.Identity.IsAuthenticated)
<li class="login-link"> {
@Html.ActionLink(User.Identity.Name, "LogOff", "Account")
</li>
}
和此控制器操作
//[HttpPost]
//[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
WebSecurity.Logout();
return RedirectToAction("Index", "Home");
}
但是当我点击退出链接时,用户不会注销。
请建议如何修复它
答案 0 :(得分:2)
在上面的代码示例中,您写道:
@if (User.Identity.IsAuthenticated)
<li class="login-link"> {
@Html.ActionLink(User.Identity.Name, "LogOff", "Account")
</li>
}
根据您的@if (User.Identity.IsAuthenticated)
语句如何解决,这可能会导致为浏览器呈现一些不稳定的代码。
以下Razor代码是否更准确地反映了您的意图?
@if (User.Identity.IsAuthenticated)
{
<li class="login-link">
@Html.ActionLink(User.Identity.Name, "LogOff", "Account")
</li>
}
答案 1 :(得分:0)
我无法发现您的代码有任何问题。 但试试这个,让我知道它是否适合你:
cshtml:
@Html.ActionLink("Log Off", "LogOff", "LogOn", null, new { @class = "actnclass" })
控制器:
public ActionResult LogOff()
{
Request.Cookies.Remove("UserId");
FormsAuthentication.SignOut();
return RedirectToAction("LogOn", "LogOn");
}
答案 2 :(得分:0)
你的Razor代码看起来不错。即使是像下面那样的基本html注销代码也应该
<a href="@Href("~/Account/LogOff")">Logout</a>
在帐户控制器的LogOff操作中保留断点,看看发生了什么。您似乎正在使用WebSecurity.Logout();
注销,然后将用户重定向到Home/Index
页面。
也想通过查看你推断用户还没有注销的内容来了解。
答案 3 :(得分:0)
您的代码没有问题。关键是Account中的Action LogOff是HttpPost方法,所以它只接受表单提交。
您必须有3种方法来实现注销功能
添加一个HttpGet重载,需要一个参数将HttpPost方法保留在Account Controller中
[HttpGet]
public ActionResult LogOff(string token) {
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
return RedirectToAction("Index", "Home");
}
// Already Exists
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff() {
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
return RedirectToAction("Index", "Home");
}
使用Javascript提交LogOff表单
@using Microsoft.AspNet.Identity
@if (Request.IsAuthenticated)
{
using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm" }))
{
@Html.AntiForgeryToken()
// ...
<a href="javascript:document.getElementById('logoutForm').submit()">LogOff</a>
}
}