Session
的設計,是HTTP為stateless
的設計,當每一次client在對Server發送request時,前後的要求並不會互相影響,server 並不會紀錄之前的狀態,也因此可以用較少的資源來服務較多的client。
也因此導致Server並不知道Client的狀態(ex.是否登入)。因此,為了讓 server記住client的行為與資料時,就需要 cookies
與session
的協助。
相對於cookie
存在client端,session
則是存在server端,server透過傳送存有session id
的cookie
給client,並在server端建立起這個session id
的檔案,在之後 client在瀏覽網頁時都會夾帶此session id
,如此一來server即可從此session id
來辨認每個使用者所儲存的狀態與 data。
1.在專案加入「Filter」資料夾,並加入一個class,用來覆寫AuthorizeAttribute
的OnAuthorization
方法達到改變驗證邏輯的需求。
2.繼承AuthorizeAttribute
,並加入System.Web.Mvc
的參考
using System.Web.Mvc;
public class AuthorizePlusAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (Convert.ToBoolean(filterContext.HttpContext.Session["auth"]))
{
//驗證成功進入
}
else
{
//驗證失敗回傳HttpError=401
base.OnAuthorization(filterContext);
}
}
}
3.簡單測試當抓到Session["auth"]==true
的驗證
4.HomeController加入三個測試的Action模擬登入登出的結果
public ActionResult Login()
{
Session["auth"] = true;
return RedirectToAction("Index");
}
public ActionResult Logout()
{
Session["auth"] = false;
return RedirectToAction("Index");
}
[AuthorizePlus]
public ActionResult Success()
{
return Content("成功登入");
}
5.Home/Index
的View加入三個button連結此三個Action
<p>
<a class="btn btn-default" href="@Url.Action("Success")">
登入狀況
</a>
</p>
<p>
<a class="btn btn-default" href="@Url.Action("Login")">
登入
</a>
</p>
<p>
<a class="btn btn-default" href="@Url.Action("Logout")">
登出
</a>
</p>
6.執行後,直接點「登入狀況」,預設Session["auth"]=false
,預設的MVC5專案因為有做登入登出的功能,因此當出現401 Error的狀況時候,預設會導回Login畫面
7.第二狀況,先點登入
,讓Session["auth"]=true
,會執行Success的Action。