demoshop

demo, trying to be the best_

這裡說的無法正常登出指的是使用了FormsAuthentication 類別 來實作的登入登出機制,並不是使用 Session 來實作的登入登出,當你在 ASP.NET MVC 使用來做登入你會發現,熟悉的 FormsAuthentication.SignOut(); 竟然會無法登出,這方面應該是屬於 ASP.NET MVC 的 Bug ,既然官方沒改那我們就繞路自己解決吧。

demo廢言如果你還不了解 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 ,千萬要注意要確保登出的寫法能正常動作。

回應討論