ASP.NET MVC 無法正常登出的解決方式
- 2011-09-25
- 21399
- 0
這裡說的無法正常登出指的是使用了FormsAuthentication 類別 來實作的登入登出機制,並不是使用 Session 來實作的登入登出,當你在 ASP.NET MVC 使用來做登入你會發現,熟悉的 FormsAuthentication.SignOut(); 竟然會無法登出,這方面應該是屬於 ASP.NET MVC 的 Bug ,既然官方沒改那我們就繞路自己解決吧。
如果你還不了解 FormsAuthentication 是什麼可以參考此篇文章ASP.NET MVC 實做登入機制,之前文章中沒有提到登出的作法,其實登出是很簡單的
public ActionResult Logout() { FormsAuthentication.SignOut(); Session.RemoveAll(); }
依據 MSDN 的說法FormsAuthentication.SignOut 方法 (System.Web.Security)是可以清除驗證的相關 Cookie,所以以上就可以達到登出的效果,但如果你發現到這種登出的寫法無效了,您可以嘗試使用下方的登出的寫法:
/// <summary> /// 登出 /// </summary> /// <returns></returns> public ActionResult Logout() { // 原本號稱可以清除所有 Cookie 的方法... FormsAuthentication.SignOut(); //清除所有的 session Session.RemoveAll(); // 建立一個同名的 Cookie 來覆蓋原本的 Cookie HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName, ""); cookie1.Expires = DateTime.Now.AddYears(-1); Response.Cookies.Add(cookie1); // 建立 ASP.NET 的 Session Cookie 同樣是為了覆蓋 HttpCookie cookie2 = new HttpCookie("ASP.NET_SessionId", ""); cookie2.Expires = DateTime.Now.AddYears(-1); Response.Cookies.Add(cookie2); //將使用者導出去 return RedirectToAction("Index", "Home"); }
藉由上方的 Code 應該很容易了解到,demo玩的招式就是自己塞了兩個 ASP.NET 拿來驗證用的 Cookie 並且設定為一年前就過期了,利用這種方式讓程式徹底的登出,如果你是用 ASP.NET MVC 也用了 FormsAuthentication ,千萬要注意要確保登出的寫法能正常動作。
回應討論