ASP.NET 提供了很方便帳號登入登出的驗證功能,今天就來說明一下,如何使用 ASP.NET 表單驗證(FormsAuthentication),來完成登入、登出以及驗證功能。
修改 web.config 啟用表單驗證 首先我們要在 web.config 的 system.web 區段底下新增設定 。 web.config 官方設定說明
authentication : 程式啟用 FormsAuthentication,設定登入頁面網址(loginUrl)、timeout 時間(預設30分鐘) 等等….
authorization :
在使用表單驗證的情況下 IIS 預設所有人都可以存取任何網頁
,所以要加入此設定,讓沒登入的使用者自動導向 loginUrl 所設定的網址。
如果沒有設定,則要自行寫 Authorize Filter 驗證使用者使用有權限存取網頁。(微軟預設提供的 Authorize
無法使用)
web config 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <configuration > <system.web > <authentication mode ="Forms" > <forms loginUrl ="Login/Index" timeout ="30" protection ="All" cookieless ="UseDeviceProfile" /> </authentication > <authorization > <deny users ="?" /> </authorization > </system.web > </configuration >
實作登入程式碼 如果對使用者的登入資訊只要使用者姓名,又或者是什麼都保持預設值就好,那其實只要一行程式碼就可以完成登入
Login 1 2 3 4 5 6 7 8 [HttpPost ] public ActionResult Login (string userName ) { FormsAuthentication.RedirectFromLoginPage(userName, false ); return RedirectToAction("Index" , "Home" ); }
如果你想要設定 timeout 時間、存取一些額外資訊等等…,那就要採用 FormsAuthenticationTicket
加密後放入 Cookie。
Login 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [HttpPost ] public ActionResult Login (string userName, string password ) { FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1 , userName, DateTime.Now, DateTime.Now.AddMinutes(30 ), false , "Extra Data" , FormsAuthentication.FormsCookiePath); string encryptedTicket = FormsAuthentication.Encrypt(ticket); HttpCookie authCookie = new HttpCookie( FormsAuthentication.FormsCookieName, encryptedTicket); Response.Cookies.Add(authCookie); return RedirectToAction("Index" , "Home" ); }
取得登入資訊 登入成功後,登入的相關資訊可以經由 Controller 的 IPrincipal User 取得
簡單的取得登入使用者姓名以及是否驗證成功的方式
Authenticated 1 2 3 4 5 6 7 8 9 public ActionResult Index ( ) { var info = User.Identity.Name; bool isAuthenticated = User.Identity.IsAuthenticated; return View(); }
將 Identity 轉型為 FormsIdentity
,取得整個 FormsAuthenticationTicket
FormsAuthenticationTicket 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public ActionResult GetFormsAuthenticationTicket ( ) { FormsIdentity id = (FormsIdentity)User.Identity; FormsAuthenticationTicket ticket = id.Ticket; string cookiePath = ticket.CookiePath; DateTime expiration = ticket.Expiration; bool expired = ticket.Expired; bool isPersistent = ticket.IsPersistent; DateTime issueDate = ticket.IssueDate; string name = ticket.Name; string userData = ticket.UserData; int verstion = ticket.Version; return View(); }
實作登出 登出只要簡單一行程式碼就可以了 FormsAuthentication.SignOut();
SignOut 1 2 3 4 5 6 public ActionResult SignOut ( ) { FormsAuthentication.SignOut(); return RedirectToAction("Index" , "Home" ); }
參考 [簡介 ASP.NET 表單驗證 (FormsAuthentication) 的運作方式 ] [Explained: Forms Authentication in ASP.NET 2.0 ] [FormsAuthenticationTicket.UserData 屬性 ] [自訂 Authorize Filter ]