2012-11-25 123 views
5

我正在运行ASP.NET MVC 4与所有默认的成员代码。为的AccountController的注销时的代码是:SimpleMembershipProvider不会破坏会话后WebSecurity.SignOut

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult LogOff() 
    { 
     WebSecurity.Logout(); 

     return RedirectToAction("Index", "Home"); 
    } 

我注意到,这个代码不破坏会议,这意味着,如果我有一个帐户登录,保存的东西会话,然后注销,并用不同的帐户登录在Web浏览器的同一个实例中,我仍然可以看到前一个用户的会话。

不知道为什么会发生这种情况。任何建议将不胜感激。谢谢。

回答

7

会话和身份验证会话不是一回事。

在这里,您销毁了用户的身份验证,但您确实重新启动了ASP.NET会话。

更多explanatition这里:https://stackoverflow.com/a/1306932/971693

试着这样做:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult LogOff() 
{ 
    WebSecurity.Logout(); 

    Session.Abandon(); 

    // clear authentication cookie 
    HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName, ""); 
    cookie1.Expires = DateTime.Now.AddYears(-1); 
    Response.Cookies.Add(cookie1); 

    // clear session cookie (not necessary for your current problem but i would recommend you do it anyway) 
    HttpCookie cookie2 = new HttpCookie("ASP.NET_SessionId", ""); 
    cookie2.Expires = DateTime.Now.AddYears(-1); 
    Response.Cookies.Add(cookie2); 


    return RedirectToAction("Index", "Home"); 
} 
4

这就是多 '的为什么' 的答案的一部分。

考虑购物车,如亚马逊,在屏幕顶部的用户名旁边有一个'This is not me'链接。

如果您将东西添加到购物车中,但WebSecurity.Logout要清除会话,那么您将失去此会话数据。

+0

或换句话说 - 他们让你决定何时清除或不清除会话 –