前沿: 一般情況下,在我們做訪問許可權管理的時候,會把用戶的正確登錄後的基本信息保存在Session中,以後用戶每次請求頁面或介面數據的時候,拿到 Session中存儲的用戶基本信息,查看比較他有沒有登錄和能否訪問當前頁面。 Session的原理,也就是在伺服器端生成一個SessionID對應了存儲的 ...
前沿:
一般情況下,在我們做訪問許可權管理的時候,會把用戶的正確登錄後的基本信息保存在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行為中添加需要登錄的視圖,這樣封裝一起就不用一個一個在控制器搞了...