本问主要介绍asp.net的身份验证机制及asp.net MVC拦截器在项目中的运用。现在让我们来模拟一个简单的流程:用户登录》权限验证》异常处理。
1、用户登录
验证用户是否登录成功步骤直接忽略,用户登录成功后怎么保存当前用户登录信息(session,cookie),本文介绍的是身份验证(其实就是基于cookie)的,下面看看代码。
引入命名空间
代码如下 | 复制代码 |
using System.Web.Security; //保存身份信息,参数说明可以看提示FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket(1, UserName, DateTime.Now, DateTime.Now.AddHours(12), false, UserData); |
现在身份信息就保存到cookie中了,如果有场景需要用到当前用户的用户ID或者别的信息的时候该怎么办呢?
那么,我们重新在cookie中获取身份信息,然后解密,再反序列化成用户实体就OK了。
代码如下 | 复制代码 |
/// /// 获取用户登录信息 /// /// public Users GetUser() { if (HttpContext.Current.Request.IsAuthenticated)//是否通过身份验证 { HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];//获取cookie FormsAuthenticationTicket Ticket = FormsAuthentication.Decrypt(authCookie.Value);//解密 return SerializeHelper.Instance.JsonDeserialize } return null; } |
2、权限验证
这里用到的是MVC中的action拦截器(重写OnActionExecuting),在action执行之前会先运行拦截器中的代码。这里同时可以身份验证是否过期。
代码如下 | 复制代码 |
/// /// |
那么在action中怎么去调用呢?这里贴出HomeController中的代码来看下。
代码如下 | 复制代码 |
[AuthAttribute(Code = "user")]//验证不通过 [AuthAttribute(Code = "admin")]//验证通过,发生异常 |
这样就可以把权限控制到action了。
3、异常处理
上面HomeController并不是继承Controller,而是继承我们自己定义的一个BaseController,那么我们来看看BaseController中有写什么东西?
代码如下 | 复制代码 |
[ErrorAttribute] public class BaseController : Controller { //所有Controller都继承BaseController,则都会进行异常捕获 } |
在这里BaseController只做了一件事情,就是增加了一个ErrorAttribute的错误拦截器,那么只要是在Controller中发生的异常都会在ErrorAttribute中进行处理,你可以记录到数据库等操作。那么我们看看ErrorAttribute是怎么工作的。
代码如下 | 复制代码 |
/// filterContext.ExceptionHandled = true; |
在这里可以把异常捕获,然后跳转到友好的错误提示页面。在MVC中几个操作就可以这样简单的完成了,关于代码在文章下面会提供下载。