asp.net MVC 4.注销功能不起作用

时间:2014-05-05 11:05:58

标签: c# asp.net-mvc asp.net-mvc-4

我的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");
}

但是当我点击退出链接时,用户不会注销。

请建议如何修复它

4 个答案:

答案 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种方法来实现注销功能

  1. 在帐户控制器中将LogOff方法更改为HttpGet而不是HttpPost
  2. 添加一个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");
    }
    
  3. 使用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>
        }
    }