Asp.Net MVC Filter权限过滤使用说明
相信对权限过滤大家都不陌生,用户要访问一个页面时,先对其权限进行判断并进行相应的处理动作。
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权限过滤使用说明的更多相关文章
- ASP.NET MVC通用权限管理系统(响应布局)源码更新介绍
一.asp.net mvc 通用权限管理系统(响应布局)源码主要以下特点: AngelRM(Asp.net MVC)是基于asp.net(C#)MVC+前端bootstrap+ztree+lodash ...
- 关于ASP.NET MVC的权限认证的一些总结
最近在学ASP.NET MVC的权限认证的一些东西,上网搜索了一阵,发现网上的方法大多数是以下几类: 一.FormsAuthentication.SetAuthCookie(admin.Name, f ...
- ASP.NET MVC Filter过滤机制(过滤器、拦截器)
https://blog.csdn.net/knqiufan/article/details/82413885 本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/ ...
- 学习之-ASP.NET MVC Filter
MVC Filter 是典型的AOP应用,对MVC框架处理客户端请求注入额外的一些逻辑,如日志记录.缓存处理.异常处理和权限验证,性能检测(横切关注点),而这些逻辑通常与主要业务无关,被独立分开作为公 ...
- asp.net mvc 全局权限过滤器及继成权限方法
全局权限过滤器 //----------------------------------------------------------------------- // <copyright f ...
- Asp.net Mvc (Filter及其执行顺序)
应用于Action的Filter 在Asp.netMvc中当你有以下及类似以下需求时你可以使用Filter功能判断登录与否或用户权限,决策输出缓存,防盗链,防蜘蛛,本地化设置,实现动态Actionfi ...
- Asp .Net MVC中常用过滤属性类
/// <summary> /// /// </summary> public class AjaxOnlyAttribute : ActionFilterAttribute ...
- asp.net mvc的权限管理设计
现在集中展示用户-角色-权限管理的功能,因此,所有数据表一律简化处理. 1 后台管理效果 (1)角色管理 (2)权限管理 2 数据库设计(MSSQL) (1)用户表dbo.Users 项 类型 ...
- ASP.Net MVC Filter验证用户登录
一.Filter是什么 ASP.NetMVC模式自带的过滤器Filter,是一种声明式编程方式,支持四种过滤器类型,各自是:Authorization(授权),Action(行为),Result(结果 ...
随机推荐
- 使用GitHub建立自己的个人主页
1.建仓库 在自己的库里建一个hujun123qwe.github.io的库 即可以使用这个名字当网址访问. 2.写内容 在库里建一个首页文件 index.html 这个个人主页只支持静态的内容,像p ...
- .NET操作JSON
http://www.cnblogs.com/txw1958/archive/2012/08/01/csharp-json.html JSON文件读入到内存中就是字符串,.NET操作JSON就是生成与 ...
- Sublime text 取消记住上一次打开的,这功能太墨迹了!
比较恨,这sublime text的配置全部都是配置文件. 选择菜单:Preferences->Settings-User,增加配置项 //热退出,其实实现一种模拟没有退出的状态,当程序再次启动 ...
- jquery常用函数与方法汇总
1.delay(duration,[queueName]) 设置一个延时来推迟执行队列中之后的项目. jQuery1.4新增.用于将队列中的函数延时执行.他既可以推迟动画队列的执行,也可以用于自定义队 ...
- 配置java环境
1.下载JDK http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 2.下载之后ne ...
- log4j使用感受
1.为什么使用日志? 日志可以记录项目中的重要信息,关键输出信息,异常信息,为项目上线后期维护提供方便,在项目开发中尽量养成习惯写日志,而不是System.out.println()打印,不过在jun ...
- SSH Tunneling Explained
转载: http://chamibuddhika.wordpress.com/2012/03/21/ssh-tunnelling-explained/ March 21, 2012 by Buddhi ...
- What is the difference between supervised learning and unsupervised learning?
Machine Learning is a class of algorithms which is data-driven, i.e. unlike "normal" algor ...
- .net中的认证(authentication)与授权(authorization)
“认证”与“授权”是几乎所有系统中都会涉及的概念,通俗点讲: 1.认证(authentication) 就是 "判断用户有没有登录?",好比windows系统,没登录就无法使用(不 ...
- eclipse安装反编译插件
1. 进入http://jadclipse.sourceforge.net/wiki/index.php/Main_Page#Download 下载 net.sf.jadclipse ...