相信对权限过滤大家都不陌生,用户要访问一个页面时,先对其权限进行判断并进行相应的处理动作。

mvc中是如何实现权限验证的?

mvc中是根据路由配置来请求控制器类中的一个方法

在mvc框架中为程序员提供了一种过滤器机制

通过过滤器,我们可以随心所欲的控制访问权限

首先,我们可以自己添加一个过滤器

添加一个类,名为MyFilter1Attribute

并继承自ActionFilterAttribute类(注意,这里的ActionFilterAttribute的命名空间是System.Web.Mvc不要引用错了~)

现在这个MyFilter1Attribute就是一个过滤器类了

因为继承自ActionFilterAttribute类

所以我们自己添加的MyFilter1Attribute就拥有了许多过滤方法

我们对ActionFilterAttributeF12转到定义看一看里面有什么东西

可以看到,这个ActionFilterAttribute是一个特性类(这就是人家为什么以Attribute结尾啦~)

并且实现了两个很重要的接口IActionFilter,IResultFilter

我们在转到定义看一下这两个接口中有什么

可以看到

这两个接口中各自定义了两个方法,而ActionFilterAttribute既然实现了它们,那么ActionFilterAttribute自然也会拥有这四个方法

那么这四个方法是什么呢?

前面我们说到过,ActionFilterAttribute其实是一个特性类

什么是特性类?

就比如实体验证的时候,为实体的字段贴上的标签Required,还有HttpPost、HttpGet等标签

而我们自己添加的MyFilter1Attribute也是一个特性类

这有什么用吗?

等下你就知道了~

现在先在MyFilter1Attribute中重写OnActionExecuting方法

其实我们可以从这个方法的名字上大概推出这个方法是做什么的了

没错,该方法会在action方法执行之前调用

反之IActionFilter中的另一个方法--OnActionExecuted就是在action方法执行完毕之后调用

public class MyFilter1Attribute:ActionFilterAttribute
{
//该方法会在action方法执行之前调用
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("我是OnActionExecuting,我在action方法调用钱执行<br/>");
base.OnActionExecuting(filterContext);
} //该方法会在action方法执行之后调用
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("我是OnActionExecuted,我在action方法调用后执行<br/>");
base.OnActionExecuted(filterContext);
} }

在Home控制器中添加一个action方法

这时候看到了吗?

要在一个action方法中使用一个过滤器

只要在该方法上贴一个过滤器的标签就ok~ 
生成运行,结果如下:

但是,有时候我们会有这样的一需求:

在过滤器中当遇到了贴了某某标签的action方法就跳过不进行验证

这怎么办呢?

可以通过filterContext的ActionDescriptor属性类完成这易操作

ActionDescriptor顾名思义,action方法的描述着

在ActionDescriptor中我们可以拿到相应的action方法信息,甚至还可以拿到一个控制器描述着ControllerDescriptor

代码如下:

结果如图:

可以看到,action方法中和OnActionExecuted中的Response.Write都没有被执行,也就是说,该action方法被跳过了

之前我们使用的是IActionFilter接口中的方法

接下来介绍IResultFilter接口方法

IResultFilter中同样也有两个方法

我们将FilterTest改为下面代码:

可以看到,IResultFilter接口中的方法和IActionFilter方法的区别就是执行位置不一样

但是呢,mvc框架中还有一个过滤器

他就是权限过滤器AuthorizeAttribute

该过滤器在所有action方法过滤器之前执行,也就是说,提供了一个可以超前验证的方法

我们在添加一个新的过滤器类,并继承自AuthorizeAttribute

重写其OnAuthorization方法如下:

这里需要注意,把基类的OnAuthorization方法去掉,因为我们并不需要,而且留着可能会出现一些错误异常

 

为FilterTest方法在贴上MyFilter2标签

运行:

有图有证据~

如此一来

我们就可以根据需要选择合适的方法进行权限验证

但是这时候又有问题了

什么问题呢?

这个特性是贴在action方法上面的

如果我控制器中所有的action方法都要进行验证怎么办?

难道每个action方法都贴一遍吗?

如果我程序中的所有控制器中的所有action方法都需要验证呢?

放心~

懒惰的程序员们是不会去做这种傻事的~

如果一个控制器中的所有方法都需要验证

那么我们可以再控制器类上统一贴上标签,如下:

这样一来该控制器中的所有action方法都会进行验证

那么如果每个控制器类都要验证呢?

这个时候我们就需要打开App_Start文件夹了

看到一个FilterConfig类了吗

双击打开FilterConfig.cs

我们可以再这里进行添加全局的过滤器,比如:

最后我们在介绍一个异常处理的过滤器

添加一个过滤器类,并继承自HandleErrorAttribute

public class MyFilter3Attribute:HandleErrorAttribute
{
//在程序中任何地方出现异常都会执行
public override void OnException(ExceptionContext filterContext)
{
//获取异常对象
Exception ex = filterContext.Exception;
//记录错误日志
//导向友好错误界面
filterContext.Result = new RedirectResult("/Home/Index");
//重要!!告诉系统异常已处理!!如果没有这个步骤,系统还是会按照正常的异常处理流程走
filterContext.ExceptionHandled = true;
//base.OnException(filterContext);
}
}
 

注意,这里基类的OnException也是不需要的

异常处理的过滤器要放在全局/App_Start/FilterConfig.cs中

Asp.Net MVC Filter权限过滤使用说明的更多相关文章

  1. ASP.NET MVC通用权限管理系统(响应布局)源码更新介绍

    一.asp.net mvc 通用权限管理系统(响应布局)源码主要以下特点: AngelRM(Asp.net MVC)是基于asp.net(C#)MVC+前端bootstrap+ztree+lodash ...

  2. 关于ASP.NET MVC的权限认证的一些总结

    最近在学ASP.NET MVC的权限认证的一些东西,上网搜索了一阵,发现网上的方法大多数是以下几类: 一.FormsAuthentication.SetAuthCookie(admin.Name, f ...

  3. ASP.NET MVC Filter过滤机制(过滤器、拦截器)

    https://blog.csdn.net/knqiufan/article/details/82413885 本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/ ...

  4. 学习之-ASP.NET MVC Filter

    MVC Filter 是典型的AOP应用,对MVC框架处理客户端请求注入额外的一些逻辑,如日志记录.缓存处理.异常处理和权限验证,性能检测(横切关注点),而这些逻辑通常与主要业务无关,被独立分开作为公 ...

  5. asp.net mvc 全局权限过滤器及继成权限方法

    全局权限过滤器 //----------------------------------------------------------------------- // <copyright f ...

  6. Asp.net Mvc (Filter及其执行顺序)

    应用于Action的Filter 在Asp.netMvc中当你有以下及类似以下需求时你可以使用Filter功能判断登录与否或用户权限,决策输出缓存,防盗链,防蜘蛛,本地化设置,实现动态Actionfi ...

  7. Asp .Net MVC中常用过滤属性类

    /// <summary> /// /// </summary> public class AjaxOnlyAttribute : ActionFilterAttribute ...

  8. asp.net mvc的权限管理设计

    现在集中展示用户-角色-权限管理的功能,因此,所有数据表一律简化处理.   1 后台管理效果 (1)角色管理 (2)权限管理   2 数据库设计(MSSQL) (1)用户表dbo.Users 项 类型 ...

  9. ASP.Net MVC Filter验证用户登录

    一.Filter是什么 ASP.NetMVC模式自带的过滤器Filter,是一种声明式编程方式,支持四种过滤器类型,各自是:Authorization(授权),Action(行为),Result(结果 ...

随机推荐

  1. MySQL数据库错误server_errno=2013的解决

    MySQL数据库错误server_errno=2013的解决 一组MySQL复制环境中的Master意外掉电,重启后Master运行正常,但该复制环境中的其它slave端,Error Log中却抛出的 ...

  2. git Clone SSL certificate problem: self signed certificate

    自己的git服务器遇到证书是自签的,git验证后会拒绝,此时,采用如下命令临时禁用就好 git -c http.sslVerify=false clone https://domain.com/pat ...

  3. Codeforces Round #358 (Div. 2) D. Alyona and Strings 字符串dp

    题目链接: 题目 D. Alyona and Strings time limit per test2 seconds memory limit per test256 megabytes input ...

  4. 【DP/二分】BZOJ 1863:[Zjoi2006]trouble 皇帝的烦恼

    863: [Zjoi2006]trouble 皇帝的烦恼 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 465  Solved: 240[Submit][ ...

  5. 【UOJ】【34】多项式乘法

    快速傅里叶变换模板题 算法理解请看<算法导论>第30章<多项式与快速傅里叶变换>,至于证明插值唯一性什么的看不懂也没关系啦-只要明白这个过程是怎么算的就ok. 递归版:(425 ...

  6. 基于Hash算法的高维数据的最近邻检索

    一.摘要 最紧邻检索:一种树基于树结构,一种是基于hash a.随机投影算法,需要产生很多哈希表,才能提高性能. b.基于学习的哈希算法在哈希编码较短时候性能不错,但是增加编码长度并不能显著提高性能. ...

  7. iOS开发之深入探讨runtime机制02-runtime的简单使用

    runtime机制为我们提供了一系列的方法让我们可以在程序运行时动态修改类.对象中的所有属性.方法. 下面就介绍运行时一种很常见的使用方式,字典转模型.当然,你可能会说,“我用KVO直接 setVal ...

  8. 【Asp.Net MVC-视频】

    Asp.Net MVC官网网发布的pluralsight视频教学: http://pluralsight.com/training/Player?author=scott-allen&name ...

  9. Android开发--使用真机进行USB调试程序

    在android小程序的开发过程中,使用eclipse中的虚拟机进行程序开发速度较慢,用真机开发可以显著提高调试的速度. 这里我用的操作系统是win7专业版,手机型号HM1S: 进行USB调试的主要步 ...

  10. java基础知识回顾之---java StringBuffer,Stringbuilder与String的区别

    public class StringBuilderTest { /** * StringBuffer和Stringbuilder :使用与内容可以被修改的字符串 * 与String的区别:Strin ...