昨天和一個技術比較好的前輩聊了聊,發現有的時候本身的學習方式有些問題,不知道有沒有和我同樣的越學習越感受到知識的匱乏不過能認識到這個問題的同窗們,也不要太心急路是一步一步走的飯是一口一口吃的認識到錯誤才能更高的改進錯誤,腳踏實地只要有上勁學習的心,終會有所成就。認識到本身薄弱的地方進行學習,要清楚學習的目的呀調理清晰:這個是什麼?爲何要這樣?能解決什麼問題?入正題吧。web
不少網站都有登陸對話框,讓事先已經註冊的用戶驗證,以便爲他們提供個性化的服務等。能夠把這個過程看做是兩件事情的發生:驗證和受權!登錄的做用是驗證請求登錄的用戶是否合法,而受權則是驗證合法的用戶在請求資源時,根據他們的權限決定是訪問仍是拒絕。瀏覽器
舉個例子:咱們已經在一個網站上登陸了,你剛把網頁關閉發現又要使用這個網站因而乎你又打開了瀏覽器而後輸入了網址,這個時候你發現還要讓你登陸才能進行操做。頻繁的這樣是失去用戶極大的體驗效果因此這個時候就用到了身份驗證。緩存
身份驗證是什麼?驗證和受權。爲何要使用?增強用戶體驗效果。能解決什麼問題?節省用戶時間避免重複性動做。安全
用戶要瀏覽須要權限的頁面,此時,安全機制先啓動,檢查當前用戶請求是否持有用戶票據的Cookie如此Cookie存在:解析Cookie中的票據信息,得到用戶角色,建立用戶標識或者對象。不然:認爲用戶無權瀏覽該頁面,跳轉至登入頁面,登入成功後重定向到所請求頁面。服務器
創建BaseController繼承Controller,而後在其餘Controller中用BaseController做爲父類來繼承。咱們在Base中實現From設置Ticket和寫入Cooike信息等操做。cookie
/// <summary> /// 保存用戶登錄信息 /// </summary> public void WriteUserInfoToCookie(UserInfo userinfo) { var jss = new JavaScriptSerializer(); var logonInfo = jss.Serialize(userinfo); //設置Ticket信息 var ticket = new FormsAuthenticationTicket(1, userinfo.Name, DateTime.Now, DateTime.Now.AddDays(1), false, logonInfo); //加密驗證票據 var strTicket = FormsAuthentication.Encrypt(ticket); //保存cookie SetCookie(FormsAuthentication.FormsCookieName, strTicket, ticket.Expiration, true); } /// <summary> /// 寫入Cooike /// </summary> /// <param name="cookiename"></param> /// <param name="value"></param> /// <param name="expires"></param> /// <param name="isSetExpires"></param> public static void SetCookie(string cookiename, string value, DateTime expires, bool isSetExpires) { var request = System.Web.HttpContext.Current.Request; var response = System.Web.HttpContext.Current.Response; var cookie = request.Cookies[cookiename] ?? new System.Web.HttpCookie(cookiename); cookie.Domain = FormsAuthentication.CookieDomain; if (value == null) { RemoveCookie(cookiename); } else { cookie.Value = value; //true表明客戶端只能讀,不能寫。只有服務端可寫,防止被篡改 cookie.HttpOnly = true; if (isSetExpires) { cookie.Expires = expires; } } response.Cookies.Add(cookie); } /// <summary> /// 移除指定名稱的cookie對象中的集合對 /// </summary> /// <param name="cookieName">cookie名稱</param> public static void RemoveCookie(string cookieName) { var cookie = System.Web.HttpContext.Current.Request.Cookies[cookieName]; var response = System.Web.HttpContext.Current.Response; if (cookie == null) return; cookie.Values.Clear(); cookie.Domain = FormsAuthentication.CookieDomain; cookie.Expires = DateTime.Now.AddDays(-10000d); response.Cookies.Add(cookie); }
public class UserInfo { public string Name { get; set; } public string PassWord { get; set; } }
<system.web> <authentication mode="Forms"> <forms name="test" protection="All" loginUrl="~/account/default" timeout="2880" /> </authentication> </system.web>
有些同窗會蒙圈爲啥會配置authentication,下面咱們看下他們的信息
在web.config文件中,<system.web>/<authentication>配置節用於對驗證進行配置。爲<authentication>節點提供mode="Forms"屬性能夠啓用Forms Authentication。一個典型的<authentication>配置節以下所示:less
<authentication mode="Forms"> <forms name=".ASPXAUTH" loginUrl="login.aspx" defaultUrl="default.aspx" protection="All" timeout="30" path="/" requireSSL="false" slidingExpiration="false" enableCrossAppRedirects="false" cookieless="UseDeviceProfile" domain="" /> </authentication>
以上代碼使用的均是默認設置,換言之,若是你的哪項配置屬性與上述代碼一致,則能夠省略該屬性。例如<forms name="MyAppAuth" />。下面依次介紹一下各類屬性:dom
咱們建立個Controller,我創建的是HomeController來進行測試ide
public class HomeController : BaseCntroller { public ActionResult Index() { if (User.Identity.IsAuthenticated) { var strUser = ((FormsIdentity)User.Identity).Ticket.UserData; var _loginInfo = new UserInfo(); if (strUser.Contains("{") && strUser.Contains("}")) { var jss = new JavaScriptSerializer(); _loginInfo = jss.Deserialize<UserInfo>(strUser); } else { //或者能夠從緩存裏面取出 } return Json(new { result = true }); } else { UserInfo user = new UserInfo(); user.Name = "焦海濤"; user.PassWord = "123456"; WriteUserInfoToCookie(user); } return View(); } }
剛進來咱們能夠看到User的identity是flase說明咱們沒有登陸過。那麼確定是else來進行寫入咱們的信息。學習
設置tick信息而後進行寫入cooike
瀏覽器中能夠看到咱們使用的Cooike,這就是咱們剛剛添加的。