时间: 2018/09/07 22:56:47
昨天和一个技术比较好的前辈聊了聊,发现有的时候自己的学习方式有些问题,不知道有没有和我一样的越学习越感觉到知识的匮乏不过能认识到这个问题的同学们,也不要太心急路是一步一步走的饭是一口一口吃的认识到错误才能更高的改进错误,脚踏实地只要有上劲学习的心,终会有所成就。认识到自己薄弱的地方进行学习,要清楚学习的目的呀调理清晰:这个是什么?为什么要这样?能解决什么问题?入正题吧。
很多网站都有登录对话框,让事先已经注册的用户验证,以便为他们提供个性化的服务等。可以把这个过程看作是两件事情的发生:验证和授权!登陆的作用是验证请求登陆的用户是否合法,而授权则是验证合法的用户在请求资源时,根据他们的权限决定是访问还是拒绝。
举个例子:我们已经在一个网站上登录了,你刚把网页关闭发现又要使用这个网站于是乎你又打开了浏览器然后输入了网址,这个时候你发现还要让你登录才能进行操作。频繁的这样是失去用户极大的体验效果所以这个时候就用到了身份验证。
身份验证是什么?验证和授权。为什么要使用?加强用户体验效果。能解决什么问题?节省用户时间避免重复性动作。
用户要浏览需要权限的页面,此时,安全机制先启动,检查当前用户请求是否持有用户票据的Cookie如此Cookie存在:解析Cookie中的票据信息,获得用户角色,创建用户标识或者对象。否则:认为用户无权浏览该页面,跳转至登入页面,登入成功后重定向到所请求页面。
建立BaseController继承Controller,然后在其他Controller中用BaseController作为父类来继承。我们在Base中实现From设置Ticket和写入Cooike信息等操作。
////// 保存用户登陆信息 /// 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); } /// /// 写入Cooike /// /// /// /// /// 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); } /// /// 移除指定名称的cookie对象中的集合对 /// /// cookie名称 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; } }
"Forms"> "test" protection="All" loginUrl="~/account/default" timeout="2880" />
有些同学会蒙圈为啥会配置authentication,下面我们看下他们的信息
在web.config文件中,
"Forms"> <forms name=".ASPXAUTH" loginUrl="login.aspx" defaultUrl="default.aspx" protection="All" timeout="30" path="/" requireSSL="false" slidingExpiration="false" enableCrossAppRedirects="false" cookieless="UseDeviceProfile" domain="" />
以上代码使用的均是默认设置,换言之,如果你的哪项配置属性与上述代码一致,则可以省略该属性。例如
我们创建个Controller,我建立的是HomeController来进行测试
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(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,这就是我们刚刚添加的。