0%

【C#】FormsAuthentication驗證模式

研究了老半天終於搞懂了,來做一下簡單的筆記
從.NET 2.0開始就已經開始實行的Form驗證模式,今天拜讀了保哥的「概略解釋 Forms Authentication 的運作」後測試的簡單心得

使用這個方法即表示驗證成功,這個驗證會記錄在電腦的cookie當中

1
FormsAuthentication.RedirectFromLoginPage(strUsername, false);

但如果你想要關閉瀏覽器時就登出,你就得改用以下方式將cookie記錄在web browser當中

1
2
3
4
5
6
7
8
//改發Ticket的方式
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, username, DateTime.Now, DateTime.Now.AddMinutes(30),false, userdata, FormsAuthentication.FormsCookiePath);

// Encrypt the ticket.
string encTicket = FormsAuthentication.Encrypt(ticket);

// Create the cookie.
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));

那如果又要實作,記住我xx天不用重新登入的功能呢?

1
2
3
4
5
6
7
8
9
//除了剛剛發Ticket之外
if (bool.Parse(remember))
{
//如果打勾記住我的話
HttpCookie cookie = new HttpCookie("rememberme");
cookie.Value = SysHelper.enCrypt(account);
cookie.Expires = DateTime.Now.AddDays(3);
Response.Cookies.Add(cookie);
}

這樣下次登入的時候只要判斷這個cookie存不存在就可以放行了!!

1
2
3
4
5
6
7
8
9
10
11
12
13
//登入Login頁面時,先判斷Form驗證已經通過了嗎?
if (!User.Identity.IsAuthenticated)
{
//沒通過的話,判斷cookie存不存在。有的話表示此人上次登入時有勾記住我!!
if ( Request.Cookies["backend"] != null)
{
//cookie如果過期的話會判斷為null,所以進得來表示cookie還沒過期,可以發Ticket給他
passTicket(SysHelper.deCrypt(Request.Cookies["rememberme"].Value), "");

return Redirect("/backend");
}
return View();
}

登出

1
2
3
4
5
6
7
8
9
10
11
//呼叫這個方法就已經登出摟~
FormsAuthentication.SignOut();

if (Request.Cookies["backend"] != null)
{
//如果cookie還沒過期,既然已經登出當然要把它重新設定為過期啦!!
HttpCookie myCookie = new HttpCookie("backend");
myCookie.Expires = DateTime.Now.AddDays(-1d);
Response.Cookies.Add(myCookie);
}
return Redirect("/backend");

最後不要搞混Response與Request了。我寫的時候沒注意到害我Debug超久的….(汗)