一般具有用户模块的系统都需要对用户是否登录进行验证,如果用户登录了就可以继续操作,否则退回用户的登录页面
对于这样的需求我们可以通过自定义一个独立的方法来完成验证的操作,但是这样代码的重复率就大大提高了
对于这样的需求,有一个比较好的解决方案,通过自定义一个全局的过滤器来完成这个操作
这里我们需要实现AuthorizeAttribute特性来完成对用户身份的验证
首先给出自定义的类,通过这个类来实现对用户身份的判断,通过重写HandleUnauthorizedRequest函数
来完成用户验证失败的处理操作,在AuthorizeCore方法中判断用户是否已经登录过网站
public class isAuthorizeAttribute : AuthorizeAttribute { protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { //根据需要添加 filterContext.HttpContext.Response.Redirect("/student/login/login?errorMSG=3"); } protected override bool AuthorizeCore(HttpContextBase httpContext) { //根据需要添加,将自动根据返回值判断用户是否通过验证 //true:通过 //false:未通过 bool result = false; if (httpContext.Session["Username"] != null) result = true; return result; } }
为了便于后期修改,将注册过滤器的操作提取出来并保存在App_Start目录中,具体类的定义如下,此处的isAuthorizeAttribute是上面定义的过滤器类
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); //注意这里的isAuthorizeAttribute filters.Add(new isAuthorizeAttribute()); } }
至此,我们完成了需要的准备工作,然后在全局的Global.asax文件中注册我们的过滤器类,由于我们已经将需要的操作包装在了FilterConfig.RegisterGlobalFilters中,
所有这里只需要通过调用这个函数便能实现我们需要的注册的功能,代码示例如下
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); //添加自定义全局登录过滤器 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); }
运行之前的注意事项
操作到这里我们完成了需要的所有工作,但是对于一个网站的运行机制来说,首页以及用户登录的页面、忘记密码、注册的页面
都是不应该进行验证的,所有我们需要对这个页面进行相应的操作,使得顺利通过验证
这里我们可以使用[AllowAnonymous]这个特性来使得页面顺利运行
示例如下
[AllowAnonymous] public class HomeController : Controller { // GET: Home public ActionResult Index() { return View(); } }
对所有的不需要验证的控制器进行设置特性后,我们便可以运行项目进行测试了,这里我们描述的是需要大量验证用户是否登录的页面,
如果遇到只有少数几个页面需要验证的情况,那我们只需要向使用基本的过滤器一样的方式来使用即可,将我们自定的过滤器特性加到
对应的控制器之上即可
过滤器的介绍可以参看http://www.cnblogs.com/ives/p/filter.html
留待后查,同时方便他人