看完上面的解释,可能你现在对这些过滤器的执行顺序,以及如何自定义过滤器还不明白,不要紧,下面我们会逐一介绍这几个基本的过滤器的使用,以及如何自定义过滤器。
2.3、使用授权过滤器
所有实现了IAuthorizationFilter接口的都可以称之为授权过滤器:其定义如下:
public interface IAuthorizationFilter { void OnAuthorization(AuthorizationContext filterContext); }
由于MVC框架系统自带的AuthorizeAttribute实现有一些突出的功能,而这种牵涉到安全的代码一定要谨慎的编写,所以一般我们不会直接实现这个接口,而是去继承AuthorizeAttribute这个类,并重写其AuthorizeCore方法,签名为: bool AuthorizeCore(HttpContextBase httpContext) 而处理授权失败的时候,可以重写其HandleUnauthorizedRequest方法,其签名为: void HandleUnauthorizedRequest(AuthorizationContext context) 。注意:验证与授权是两回事,验证发生在授权之前。
默认的授权过滤器已经有了验证的功能,其验证的机理是利用Asp.net平台自带的验证机制,如表单验证和Windows验证。除了验证功能,它本身还有授权的功能。授权过滤器是所有过滤器中最早运行的。
经过Route到达了控制器的时候,在调用Action之前,MVC框架会检测在相关的Action上是否有授权过滤器,如果有会调用OnAuthorization方法,如果此方法批准了请求,才会调用相应的Action。
使用授权过滤器几种情况如下:
1.直接在Action上或者控制器上加Authorize,表示启用了验证,但不牵涉到授权。
2.添加Authorize(Users=“a,b”)],表示启用了验证,并且也启用了授权,只有a或者b用户能访问此控制器。
3.当添加Authorize(Roles=“admin,Member”)]时的步骤如下:
---利用asp.net自带的角色提供者,或者实现自己的角色提供者,实现自己的角色提供者时,只需要集成RoleProvider类型,并实现其中的所有方法或部分方法,最好实现所有方法。
---在Web程序的根目录的Web.config文件中配置角色管理者。
---在适当的Action中利用Roles类型来访问自己创建的RoleProvider中的相关方法。
使用内置的授权过滤器
MVC框架内置的授权过滤器AuthorizeAttribute,它允许我们使用这个类的两个公共属性来指定授权策略,如下所示:
Users和Roles两者是并且的关系,例如Users=“a,b,c”,Roles=“admin”,表示用户是a,b,c 其中一个并且是Admin角色才能访问。
创建自定义的授权过滤器
方式一:直接实现IAuthorizationFilter接口,但不推荐这样做,因为牵涉到安全方面的代码。
方式二:继承AuthorizeAttribute这个类,并重写其AuthorizeCore方法,签名为: bool AuthorizeCore(HttpContextBase httpContext),代码如下所示:
public class MyAuthorizeAttribute : AuthorizeAttribute { private string[] allowedUsers; public MyAuthorizeAttribute(params string[] users) { allowedUsers = new string[] { "admin", "user1", "xf" }; } protected override bool AuthorizeCore(HttpContextBase httpContext) { return httpContext.Request.IsAuthenticated &&allowedUsers.Contains(httpContext.User.Identity.Name, StringComparer.InvariantCultureIgnoreCase); } }
2.4、使用动作过滤器
动作过滤器是可以以用于任何目的的多用途过滤器,创建自定义动作过滤器需要实现IActionFilter接口,该接口代码如下所示:
该接口定义了两个方法,MVC框架在调用动作方法之前,会调用OnActionExecting方法。在调用动作方法之后,则会调用OnActionExecuted方法。
实现OnActionExecting方法
参数ActionExecutingContext对象继承于ControllerContext,其中的2个属性:
ActionDescriptor:提供了关于Action方法的相关信息
Result:类型为ActionResult,通过给这个属性设置一个非null的值就可以取消这个请求。
我们可以用过滤器来取消一个请求,通过设置Result属性即可。代码如下所示: