前沿:
一般情況下,在我們做訪問許可權管理的時候,會把使用者的正確登入後的基本資訊儲存在Session中,以後使用者每次請求頁面或介面資料的時候,拿到
Session中儲存的使用者基本資訊,檢視比較他有沒有登入和能否訪問當前頁面。
Session的原理,也就是在伺服器端生成一個SessionID對應了儲存的使用者資料,而SessionID儲存在Cookie中,客戶端以後每次請求都會帶上這個
Cookie,伺服器端根據Cookie中的SessionID找到儲存在伺服器端的對應當前使用者的資料。
FormsAuthentication是微軟提供給我們開發人員使用,做身份認證使用的。通過該認證,我們可以把使用者Name 和部分使用者資料儲存在Cookie中,
通過基本的條件設定可以,很簡單的實現基本的身份角色認證。
1.配置項
在網站根目錄配置web.config
<authentication> <forms name=".ASPXAUTH" loginUrl="account/index" defaultUrl="http://www.baidu.com" protection="All" timeout="30" path="/" requireSSL="false" slidingExpiration="true" enableCrossAppRedirects="false" cookieless="UseDeviceProfile" domain="" ></forms> </authentication>
2.控制器程式碼
public class accountController : Controller { // GET: account public ActionResult Index() { return View(); } [Authentication] public ActionResult Demo() => View(); [HttpPost] [ValidateAntiForgeryToken] public ActionResult Index(string username,string userpwd) { List<LoginVm> userlist = new List<LoginVm>()//模擬資料 { new LoginVm() { name="Zara", pwd="123456",State=1}, new LoginVm(){name="aaaa",pwd="666666",State=0} }; if (!ModelState.IsValid) { return View(); } bool status = Request.IsAuthenticated; LoginVm vm = userlist.FirstOrDefault(u => u.name == username && u.pwd == userpwd); JavaScriptSerializer serial = new JavaScriptSerializer(); //判斷是否存在 且狀態ok if (vm!=null) { if (vm.State==0)Content("您倍封號"); FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket( 1, vm.name, DateTime.Now, DateTime.Now.AddMinutes(30), false, serial.Serialize(vm)); string encrytedTicket = FormsAuthentication.Encrypt(authTicket);//建立票據 //響應客戶端 HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName,encrytedTicket); HttpContext.Response.Cookies.Add(authCookie); } return View(); } }
3.過濾器方面
/// <summary> /// 該過濾器為網站提供服務 /// 服務內容:行為新增標記即可進行過濾.不用在每個action中進行過濾! /// </summary> public class AuthenticationAttribute: ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { if (!filterContext.RequestContext.HttpContext.Request.IsAuthenticated) { if (filterContext.HttpContext.Request.IsAjaxRequest()) { filterContext.Result = new JsonResult { Data = new { Status = -1, Message = "登入過期,請重新登入!" }, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; } else { FormsAuthentication.RedirectToLoginPage();//重定向會登入頁 } } else { var cookie = filterContext.HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName]; //解密使用者票據 var ticket = FormsAuthentication.Decrypt(cookie.Value); //將密文對映到實體模型 LoginVm admin = new JavaScriptSerializer().Deserialize<LoginVm>(ticket.UserData); //將資料放到ViewData裡 方面頁面使用 filterContext.Controller.ViewData["username"] = admin.name; filterContext.Controller.ViewData["userpwd"] = admin.pwd; } //Don`t forget this one base.OnActionExecuting(filterContext); } }
我們可以在aciton行為中新增需要登入的檢視,這樣封裝一起就不用一個一個在控制器搞了…