一:知识点部分

权限是做网页经常要涉及到的一个知识点,在使用MVC做权限设计时需要先了解以下知识:

MVC中Url的执行是按照Controller->Action->View页面,但是我们经常需要在函数执行所指定的Action之前或者action方法之后处理一些逻辑,为了处理这些逻辑,ASP.NET MVC允许你创建action过滤器Filter,我们都知道在Action上使用的每一个 [Attribute]大都是自定义的Filter。

mvc提供四种类型的Filter接口:IActionFilter,IAuthorizationFilter,IExceptionFilter,IResultFilter, 这四种Filter足以满足我们所要实现的功能,它还提供了几个现

成的可以使用的Filter:OutputCacheAttribute、 HandleErrorAttribute、AuthorizeAttribute。(AuthorizeAttribute 和 HandleErrorAttribute继承自FilterAttribute 类)

其中:

IActionFilter提供的两种方法: OnActionExecuting 在调用操作方法前调用。OnActionExecuted 在调用操作方法后调用。

IResultFilter提供的两种方法:OnResultExecuting 在执行由操作方法返回的操作结果前调用。OnResultExecuted 在执行由操作方法返回的操作结果后调用。

IAuthorizationFilter是一个用于身份验证的Filter。只提供了一个void OnAuthorization(AuthorizationContext filterContext)方法。

IExceptionFilter会在出现异常的时候调用,也是只提供一个void OnException(ExceptionContext filterContext)的方法;

而4个接口的方法执行顺序如下:IAuthorizationFilter -> IActionFilter - >IResultFilter ->IExceptionFilter

【 ActionExecutedContext类包含一个 Canceled的属性,允许你取消当前的 Action】

现在我们来看一下用得最多的一个类ActionFilterAttribute:

他的继承层次结构为

System.Object 
  System.Attribute
    System.Web.Mvc.FilterAttribute
      System.Web.Mvc.ActionFilterAttribute
        System.Web.Mvc.AsyncTimeoutAttribute
        System.Web.Mvc.OutputCacheAttribute

public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter{
}
他继承了 FilterAttribute, IActionFilter, IResultFilter三个类,通常我们在Action逻辑之前需要处理一些功能,比如权限等,因此会自定义一个Filter,它继承于
ActionFilterAttribute ,然后再在ActionFilterAttribute 中重载由接口 IActionFilter, IResultFilter继承下来的函数
void OnActionExecuting(ActionExecutingContext filterContext)
void OnActionExecuted(ActionExecutedContext filterContext)
void OnResultExecuting(ResultExecutingContext filterContext)
void OnResultExecuted(ResultExecutedContext filterContext)

其中ActionFilterAttribute有两个属性,一个是继承FilterAttribute,另一个继承Attribute

Order 获取或者设置执行操作筛选器的顺序。 (继承自 FilterAttribute。)

TypeId 当在派生类中实现时,获取该 Attribute 的唯一标识符。 (继承自 Attribute。)

例如如下代码段:

[orderFilter(RoleId="2",Order=2)]
[UserFilter(UserId="3",Order=1)]
public ActionResult test() {
return View();
}

程序在执行的顺序为:UserFilter->orderFilter->test

二:实例部分

了解上面的一些知识后,我们来看一下我设计的权限实例:
如果不知道用户,角色,组,权限之前的一些关系,建议你先看我上一篇“权限的基础知识”,这篇文章是我转过来的,觉得还不错,因为之前自己做完项目后没
分的很清楚,现在看完那篇文章,对号入座,才清楚原来我也是按照用户,角色,组,权限等这些关系来进行着 ^_^(如果下面对号入座的不对,请大家指正)
假设现在有4种功能权限: 添加功能、删除功能、发布功能、修改功能等。按照二进制01格式来设计,0表示没有该功能权限,1表示有该权限,
也就是说,按照顺序
          添加 删除 发布 修改
          1 1 1 1   如果只有修改功能 就是0001,
                      如果有添加及删除功能 就是1100, 将二进制转换为int数 添加功能:(1000=int数 8) 删除功能:(0100=int数 4) 发布功能:(0010=int数 2) 修改功能:(0001 =int数 1)
            这我可以理解为 -----权限
而每个用户拥有的功能(权限)是不一样的 ,可以有多种组合, 比如1001(添加及修改权限) 0011(发布及修改权限) 1111(全部权限)
            这我可以理解为-------组
而对不同用户我将他们的权限组合功能变为int 数存于user表的Permission(int)字段中,这样的话:(添加及修改权限1001=int数 9)
(发布及修改权限0011=int 数 3) (全部权限1111=int数 15)
            这我可以理解为--------角色
至于用户就是我们自己数据库里面的username了. 设置用户权限:只需要将所拥有功能权限的int数相加存入数据库就可;
查看用户权限:则需要先将Permission的int值解析为二进制数,然后再看为1 的位数的int数值与对应的功能值就可。
实现: 当用户登录的时候,先查看他的Permission的int值(就是角色),将角色解析为相应的组,将每组的权限int值载入用户主体的Roles,他是一个数组形式。
(因为有一种或多种功能权限)
然后在每个需要进行权限过滤的Action上加上自定义的Filter:即在重载的OnActionExecuting方法内判断是否当前用户的Roles里面存在该功能权限,如果存在,
则进入页面,否则跳到无权限页面。 下面就是代码了,继承ActionFilterAttribute类,并且重载OnActionExecuting方法:
publicclass RoleFilter : ActionFilterAttribute {
publicstring checkRole { get; set; } //应传入的功能权限值
publicoverridevoid OnActionExecuting(ActionExecutingContext filterContext) {
if(!string.IsNullOrEmpty(checkRole)) {
if(!filterContext.HttpContext.User.Identity.IsAuthenticated) { //判断用户是否已经登录,没登录跳转到登录页面,
string okurl = filterContext.HttpContext.Request.RawUrl;
string redirectUrl =string.Format("?ReturnUrl={0}", okurl);
string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;
filterContext.Result =new RedirectResult(loginUrl);
} else { //已登录用户
bool isAuthorize = filterContext.HttpContext.User.IsInRole(checkRole);
if(!isAuthorize) //判断用户是否拥有checkRole权限,没有的话跳转到权限错误页。
filterContext.Result =new RedirectToRouteResult("Default", new RouteValueDictionary(new { Controller ="Account", Action ="AuthorizeError" }));
}
} else {
thrownew InvalidOperationException("该用户没有指定角色,请联系管理员给予角色。");
}
}
}
在程序刚启动的时候如要读取用户角色的权限。才好做上面的比较:
public MvcApplication() {
AuthorizeRequest +=new EventHandler(MvcApplication_AuthorizeRequest);
} void MvcApplication_AuthorizeRequest(object sender, EventArgs e) {
//获取当前用户的角色
if(HttpContext.Current.User.Identity.IsAuthenticated) {
          //下面这个方法是将role(int)转换为二进制 然后算个每个权限的int值 数组
var roles = CMSPermissionController.Instance.PermissionIdList(HttpContext.Current.User.Identity.Name.Trim()).ToArray<string>();
HttpContext.Current.User =new System.Security.Principal.GenericPrincipal(HttpContext.Current.User.Identity, roles);
}
}
调用的过程为:
//根据需要你也可以对整个Controller加【attribute】
[RoleFilter(checkRole ="2")]
publicclass GroupController : Controller {
public ActionResult Index() {
return View();
} public ActionResult Create() {
return View();
}
} //也可以对某个特定的Action添加
[RoleFilter(checkRole ="4")]
publicstring Delete(string RelaPath) {
//to do ...
}
上面的代码基本上就可以实现了,在调试的过程中,曾经有个同事问,如果我要在Delete上也要检查checkRole="8"的时候你怎么办,我当时有点懵。。。没想
太多,就觉得那到底是先checkRole是4还是先checkRole是“8”呢,现在看来,不存在那样状况, 因为我定义的4,8等数字, 本身就是定死的权限,比如
添加 删除 发布 修改对应的权限数字是8,4,2,1;所以如果我们要对Delete本来是4的权限,来检查添加的权限8,业务逻辑上本身也是不存在的! O(∩_∩)O 原文来自http://www.cnblogs.com/Joans/archive/2011/07/20/2110775.html

.net mvc Authorization Filter,Exception Filter与Action Filter的更多相关文章

  1. MVC Action Filter

    ASP.NET MVC Framework支持四种不同类型的Filter: Authorization filters – 实现IAuthorizationFilter接口的属性. Action fi ...

  2. ASP.NET MVC的Action Filter

    一年前写了一篇短文ASP.NET MVC Action Filters,整理了Action Filter方面的资源,本篇文章详细的描述Action Filter.Action Filter作为一个可以 ...

  3. AspNet MVC : 操作/控制器过滤器(action filter)

    1.Action Filter Action Filter提供了在执行action/controller前后对请求/响应修改的能力,可以应用于action和控制器上,作用在控制器上将自动被应用到该控制 ...

  4. ASP.NET MVC 4.0的Action Filter

    有时候你想在调用action方法之前或者action方法之后处理一些逻辑,为了支持这个,ASP.NET MVC允许你自定义创建action过滤器.Action过滤器是自定义的Attributes,用来 ...

  5. 返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test

    原文:返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test [索引页] [源码下载] 返璞归真 ...

  6. ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)

    于ASP.NET MVC Preview5. 前一篇中我们已经了解了Action Filter 与 内置的Filter实现,现在我们就来写一个实例.就写一个防盗链的Filter吧. 首先继承自Filt ...

  7. [转]ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)

    前一篇中我们已经了解了Action Filter 与 内置的Filter实现,现在我们就来写一个实例.就写一个防盗链的Filter吧. 首先继承自FilterAttribute类同时实现IAction ...

  8. asp.net MVC 3/4 equivalent to a response.filter

    am in a need to intercept all of the html that will be sent to the browser and replace some tags tha ...

  9. Spring MVC 项目搭建 -6- spring security 使用自定义Filter实现验证扩展资源验证,使用数据库进行配置

    Spring MVC 项目搭建 -6- spring security使用自定义Filter实现验证扩展url验证,使用数据库进行配置 实现的主要流程 1.创建一个Filter 继承 Abstract ...

  10. ASP.NET MVC和ASP.NET Core MVC中获取当前URL/Controller/Action (转载)

    ASP.NET MVC 一.获取URL(ASP.NET通用): [1]获取完整url(协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [ ...

随机推荐

  1. Objective-C时间戳转换的转换和时间

    什么是时间戳? 时间戳(timestamp),一般是一个字符序列.唯一地标识某一刻的时间.数字时间戳技术是数字签名技术一种变种的应用. 思考:简单来讲就是依据文件hash加密后生成的摘要和时间生成的时 ...

  2. English - 定冠词和不定冠词(a an the) 的区别

    不定冠词表示泛指,定冠词表示特指. 不定冠词a (an)与数词one 同源,是"一个"的意思.a用于辅音音素前,一般读作[e],而an则用于元音音素前,一般读做[en]. 1) 表 ...

  3. Filemanager 的使用

    filemanager的使用包括: 1.创建文件夹 2.删除文件夹 3.写入文件 4.复制文件 5.移动文件 6.删除文件​ 一.创建文件夹​ 首先宏的定义一个字符串作为地址的​来获取当前的docum ...

  4. Linux 抓包

    tcpdump -i eth1 -s 0 -w eth1_2.log  tcp port 8893

  5. XSS【跨站脚本攻击】

    从客户端(txt="<script><a href="www...")中检测到有潜在危险的 Request.Form 值. 如果你使用的是.NET 3. ...

  6. Django Web开发【3】创建网络收藏夹

    这一节我们将继续一个创建网络收藏夹应用,并学习视图.模型以及模板的处理过程. Django是一个MVC开发框架,但是它的控制器对应的为view,而视图对应为模板(template),模型对应model ...

  7. NETTY 编码器介绍

    1. 背景 1.1. 编解码技术 通常我们也习惯将编码(Encode)称为序列化(serialization),它将对象序列化为字节数组,用于网络传输.数据持久化或者其它用途. 反之,解码(Decod ...

  8. codeforces 546D Soldier and Number Game

    题目链接 这个题, 告诉你a, b的值, 那么只需要求出b到a之间的数, 每个数有多少个因子就可以. 具体看代码, 代码里面有解释 #include<bits/stdc++.h> usin ...

  9. python读取word表格内容(1)

    1.首页介绍下word表格内容,实例如下: 每两个表格后面是一个合并的单元格

  10. mysql 函数执行权限

    mysql> show grants for query_all@'115.236.1x0.x'; +---------------------------------------------- ...