2014-05-05 70 views
1

我有这个网站在我的asp.net MVC 4应用:asp.net MVC 4注销功能不能正常工作

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

但是当我点击日志out链接,用户不会注销。

请建议如何解决它

+0

能否将Html.actionlink()生成的链接粘贴到浏览器中? –

回答

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"); 
} 
+0

如果您找不到有人发布的代码有任何问题,请不要只需复制粘贴自己的代码即可。另一个答案指出了代码的一些具体问题。 –

0

你的剃须刀的代码看起来不错。即使是像下面这样一个基本的HTML代码注销应该做

<a href="@Href("~/Account/LogOff")">Logout</a> 

请您注销等动作断点在您的账户控制器和看到发生了什么。您好像使用WebSecurity.Logout();注销,然后将用户重定向到Home/Index页面。

另外想知道通过看看你推断该用户没有注销。

2

在上面的代码示例中,你写道:根据您的@if (User.Identity.IsAuthenticated)声明如何解决,这可能导致一些靠不住的代码正在为浏览器呈现

@if (User.Identity.IsAuthenticated) 
       <li class="login-link">  { 
    @Html.ActionLink(User.Identity.Name, "LogOff", "Account") 
</li> 
} 

以下Razor代码是否更加正确地反映您的意图?

@if (User.Identity.IsAuthenticated) 
{ 
    <li class="login-link"> 
     @Html.ActionLink(User.Identity.Name, "LogOff", "Account") 
    </li> 
} 
0

你的代码没有问题。重点是帐户中的操作注销是HttpPost方法,因此它只会接受表单提交。

你必须3种方式来实现注销功能

  1. 变更注销等方法HTTPGET代替HttpPost的账户控制器
  2. 添加HTTPGET过载为它取一个参数离开HttpPost方法账户控制器

    [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来提交注销形式

    @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> 
        } 
    }