MVC 自定义过滤器/特性来实现登录授权及验证

简介: 最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。   十年河东十年河西,莫欺少年穷   学无止境,精益求精   最近在做自学MVC,遇到的问题很多,索性一点点总结下。

   最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。

   十年河东十年河西,莫欺少年穷

   学无止境,精益求精

   最近在做自学MVC,遇到的问题很多,索性一点点总结下。

   写过webForm项目的童鞋都知道,在执行Page_Load()之前,会执行:OnInit(EventArgs e),那么在MVC中,在执行Action方法之前,会执行什么呢?在执行MVC Action之后,又会执行什么呢?下面给出答案:

   1、OnActionExecuting  在执行操作方法之前由 MVC 框架调用。

   2、OnActionExecuted  在执行操作方法后由 MVC 框架调用。

   3、OnResultExecuting  在执行操作结果之前由 MVC 框架调用。

   4、OnResultExecuted  在执行操作结果后由 MVC 框架调用。

   根据上述,我们可以看出,在执行Action方法之前,MVC会执行OnActionExecuting()方法,这个方法在控制器中并没有展示给我们,需要我们进行重写。

   下面以程序为例进行说明:

namespace WeiXinApi.Controllers
{
    //统一授权验证
    [Authorize(Roles = "admins")]
    public class MangerController : Controller
    {
        public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
        {
            if (true)
            {
                //执行相关操作
               //................一般执行如下操作................
               //读取用户登录信息,获取用户权限
                //MVC Form验证是通过Cookies实现的,因此在此处读取Cookies 并作验证
            }
            else
            {
                //如果验证失败,则返回登陆页
                filterContext.HttpContext.Response.Redirect("/Home/Login");
            }
        }

        public MangerController()
        {
            ViewBag.NewsCount = 43;
        }

        public ActionResult index()
        {
            return View();
        }
        public ActionResult wei_Configs()
        {
            return View();
        }
        

    }
}

   那么,按照上述的思路,如果你有多个Controller需要验证,那么就必须在每个Controller中重写这个方法,显然这样做是比较笨的方法,那么我们动动我们聪明的小脑袋,很快会想出一个方法:那就是继承。

   我们写一个父亲控制器,在这个父亲控制器中,我们重写这个方法,然后在需子控制器中继承父亲控制器即可,代码如下:

   

   

   看到这儿,相信做过webForm的童鞋就会想起basePage.cs中的如下代码:

   

   那么,这样定义一个父亲控制器就算完美了吗?如果有个控制器需要继续另外一个类怎么办?

   由于其已经继承了父亲控制器,那么子控制器就不能再继承其他类,这样显然降低了程序的可扩展性,我们应当怎么办呢?

   还好,MVC为我们提供了过滤器,ActionFilterAttribute里也有OnActionExecuting方法,跟Controller中的OnActionExecuting方法一样, 同是抽象实现了IActionFilter接口。

   我们新建派生类如下:

namespace WeiXinApi.App_Start
{
    public class AuthenticationAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
        {
            string cookieName = FormsAuthentication.FormsCookieName;//读取登录授权Cookies的名称
            HttpCookie authCookie = System.Web.HttpContext.Current.Request.Cookies[cookieName];//接收这个Cookies
            FormsAuthenticationTicket authTicket = null;
            try
            {
                authTicket = FormsAuthentication.Decrypt(authCookie.Value);//我们知道MVC登录授权的Cookies是加密的,所以我们在此需要解密
            }
            catch (Exception ex)
            {
                return;
            }
            if (authTicket != null && filterContext.HttpContext.User.Identity.IsAuthenticated)//如果Cookies不为Null 也通过验证
            {
                string UserName = authTicket.Name;
                CommonMethod.setCookieForMIn("UserName", UserName, 30);//用于全局,加载用户信息
                base.OnActionExecuting(filterContext);
            }
            else
            {
                filterContext.HttpContext.Response.Redirect("/Home/Login");//否则跳转至登陆页
            }
        }
    }
}

   至于MVC登录授权的方法,大家可以参考我的博客:MVC 登录认证与授权及读取登录错误码

   在此,我们深究下ActionFilterAttribute 类的说明:

   

   在此:问大家一个问题,何为:Attribute ?

   中文名称解释为特性、属性

   MVC的数据注解与验证中会用到好多特性,譬如:

   

   那么,我们应当怎么使用新建的 AuthenticationAttribute 类呢?

   

   根据需求,大家可在类范围内使用这个特性,亦可在Action方法头上使用这个特性。

   以上便是MVC自定义过滤器特性来验证授权登录信息的方法

   祝大家有个好心情,谢谢

   @陈卧龙的博客

相关文章
|
18天前
|
前端开发 Java Spring
自定义 Spring MVC Controller 方法参数处理
【6月更文挑战第3天】在 Spring MVC Controller 的方法参数,Spring 会自动为我们注入一些特殊的参数值,比如 HttpServletRequest、HttpServletResponse 等对象,或者 HTTP 请求参数。
59 0
|
1月前
|
前端开发 Java
自定义mvc的增删改查
自定义mvc的增删改查
40 0
|
1月前
|
XML 前端开发 数据格式
自定义MVC引用XML配置文件实现
自定义MVC引用XML配置文件实现
46 0
|
1月前
|
设计模式 前端开发 搜索推荐
自定义mvc框架
自定义mvc框架
46 0
|
6月前
|
设计模式 前端开发
自定义mvc
自定义mvc
35 0
|
6月前
|
XML 前端开发 数据格式
自定义MVC超详细易懂----增删改查
自定义MVC超详细易懂----增删改查
|
6月前
|
存储 前端开发 架构师
自定义MVC实现 很详细(下)---优化版
自定义MVC实现 很详细(下)---优化版
|
1月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
91 0
|
1月前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
35 0
|
10月前
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
135 0