用户登陆功能的实现总结

 

背景:
    

        最近在做活动后台重构,涉及到了用户的登陆功能,其实也算作一个登陆系统吧,之前该项目是没有登陆功能的,所以这个项目下就没有什么参考的了,就翻看了下自己之前参与过的项目,总结一下登陆功能所涉及的技术吧。

 

架构:

 

       基本实现都差不多,有如下几大模块吧:① 都是会有一个Auth 或者 Identity 专门负责处理 登陆、退出、是否登陆、以及Cookie记录等操作。② 在进入每个基本页面(WebForm)或者控制器(MVC-Controller)前会先进入一个处理的方法中,这个方法根据架构不同实现的方式不同。③ 登陆页或登陆控制器,这里的作用傻子都知道,就是在用户登陆或者进入其他带有权限的地方被拦截后跳转到这里处理的。

 

    ⑴ WebForm 中实现

          ① 这里统一交 Identility 类 吧,这里主要三个方法【登陆、退出、是否登陆】以及一些基本字段(字段供后面使用,如记录日志之类的),登陆方法负责校验账号及密码,这里的密码校验一般是先将密码按照原有的规则采用MD5加密,完后再和库中的用户密码做比较(这是一个md5碰撞的过程),失败则在登陆页面抛错,成功的话要记录会通过FormAuthentication.SetAuthCookie()方法记录Cookie,这里会有人问为什么要通过那个方法来设置Cookie呢?当然你说你任性,可以不用,那你自己来通过解析Cookie来设置IsAuthenticated 从而判断用户是否登陆,这里是为了使用.NET自带的身份认证,使用上述方法后,你可以通过HttpContext.Current.User.Identity.IsAuthenticated来验证用户是否登陆了,因为它返回一个bool值。退出方法就是清掉Cookie,跳转到登陆页面即可,很简单;判断用户是否登陆方法,直接调取刚刚说的HttpContext.Current.User.Identity.IsAuthenticated 或者 调取你自己任性写的 IsAuthenticated 属性也行。

          ② WebForm实现这一步是通过继承一个基类页面 假设为 PageBase 类,基类 PageBase 又继承 System.Web.UI.Page,在这个基类里要重写 Page 类 的OnInit() 方法,这个方法是在进入页面前先进入这个方法,在这里你可以判断用户是否登陆,未登录则直接 Response.Write("登陆页.aspx");这里注意一点,面试时候有些傻逼面试官会问你子页面的OnInit()方法以及Onload()方法和基类页面的OnInit()和Onload()方法的执行顺序,不要被面试官的淫威所吓倒,这里就是一个递归嵌套执行的过程,先执行子页面的OnInit()方法,这里会调用基类的OnInit(),基类的执行完后,在回到子页面的OnInit()的方法,完后执行完毕,Onload()同理。

          ③ 这一步最简单了,登陆的调用 Identity 类的登陆方法,退出调用退出方法即可。最多在前端加些请求操作(表单提交或者Ajax异步,看自己喜好)。

 

    ⑵ Mvc中实现

          ① 第一步这里和Webform实现基本一样,不说了。

          ② 第二步,既然用的MVC框架,那么就要Filter过滤器来实现了,这里我们可以建一个文件夹命名为Filter,创建一个类,记得类名要以 Attribute 结尾,例如就叫 IdentityAithorizeAttribute,该类需要继承ActionFilterAttribute属性,类内通过重写OnActionExecuting()方法内调用IdentityIsAuthenticated ,判断是否登陆,未登录的话跳转到登陆页。完后在需要限制的控制器或者操作上添加[IdentityAuthorize]特性来实现限制拦截。

          ③ 同WebFrom的③,Mvc一般会采用Ajax异步的方式提交来提高用户的体验性。

 

 

总结:

 

        这只是根据自己现有的技术认知总结出来的,所以可能会存在一定的局限性。写这篇文章之前,觉得可能会有很多内容涉及进来,边写边发现其实好多技术都是相通的,只是实现方式不同罢了,所以越往后写越简略了,当然这和现在的我们对MVC更了解,所以随便写写大家也能看懂,哈哈哈。有一点注意,在插入Cookie的时候一定要设置为只读,不然会有Cookie被串改的风险。脚本是可以操作Cookie的,这一点大家是知道的。

 

posted @ 2019-05-01 06:35  NCat  阅读(1071)  评论(0)    收藏  举报