2018年3月14日 星期三

ASP.NET MVC FormsAuthenticationTicket 驗證

透過 FormsAuthenticationTicket 進行使用者是否登入的驗證

FormsAuthenticationTicket 此功能主要在記錄使用者是否已經登入,實際上
會產生一組 Cookie,內含一組經過加密的編碼,.net 可以透過檢核這組編碼,
來判斷使用者是否已經登入(或者說已獲得允許使用的權限)。

使用者在開啟頁面,程式進入 Action 前,先檢查使用者登入的驗證,也就是指
是否已取得 ticket,若未通過驗證,則跳轉到登錄頁,若已驗證,則允許進入
Action 內。

當使用者已經在登錄頁登錄,且檢核通過,則產生一張 ticket (也就是一組 Cookie),
當使用者切換頁面時,瀏覽器便會再把這組 ticket(Cookie),帶到後端,後端只
要檢核這組 ticket,就可以得知使用者是否仍處於已驗證的狀態。

1.在要進行驗證的 Action 前掛上 [Authorize()]
    [Authorize()]
    public ActionResult Home2()
    {
        return View();
    }
2.在 WebConfig 中加上,當驗證失敗時要導向的頁面位置(要加在專案下的那個 WebConfig)
    <system.web>
        <authentication mode="Forms">
            <forms loginUrl="Login/Index" cookieless="UseCookies" timeout="2880" />
        </authentication>
    </system.web>
3.當使用者登入後,寫入一張 ticket,讓之後進入 action 前能通過 [Authorize()] 驗證
    public ActionResult Login(string uid)
    {
        //驗證使用者輸入的帳號密碼
        if (uid.ToUpper() == "UID")
        {
            //驗證通過,建立一張 ticket
            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                1,                                      //票證的版本琥碼
                uid,                                    //與票證相關的使用者名稱
                DateTime.Now,                           //核發此票證時的本機日期和時間
                DateTime.Now.AddMinutes(60),            //票證到期的本機日期和時間
                false,                                   //如果票證將存放於持續性Cookie中,則為true
                "",                                     //要與票證一同存放的使用者特定資料
                FormsAuthentication.FormsCookiePath);   //票證存放於Cookie中時的路徑

            //ticket 生成 cookie
            string encTicket = FormsAuthentication.Encrypt(ticket);
            HttpCookie httpCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
            httpCookie.HttpOnly = true;

            //cookie 寫入 response
            Response.Cookies.Add(httpCookie);

            //轉向到首頁
            return View("Home");
        }
        else
        {
            //驗證不通過,返回到登錄頁
            return View("Index");
        }
    }

沒有留言:

張貼留言