笨鸟先飞之ASP.NET MVC系列之过滤器(02授权过滤器)
2017-10-06 19:43
549 查看
授权过滤器
概念介绍
在之前的文章中我们已经带大家简单的了解了下过滤器,本次我们开始介绍授权过滤器。我们之前提到过授权过滤器在认证过滤器之后,其他过滤器和方法被调用之前运行,而授权过滤器和它名字的含义一样主要是负责执行我们的授权逻辑,确保我们要调用的方法只被我们认证过的用户使用。
自定义授权过滤器
首先我们还是用之前创建的MVC项目模板,我们在里面新建一个Filter文件夹,我们的过滤器文件就放在这,接着我们创建一个授权过滤器CustomAuthAttribute
接着我们继承
FilterAttribute类,和
IAuthorizationFilter接口
namespace System.Web.Mvc { // // 摘要: // 定义授权筛选器所需的方法。 public interface IAuthorizationFilter { // // 摘要: // 在需要授权时调用。 // // 参数: // filterContext: // 筛选器上下文。 void OnAuthorization(AuthorizationContext filterContext); } }
接着我们必须实现接口中的
OnAuthorization方法就像下面这样
public class CustomAuthAttribute : FilterAttribute, IAuthorizationFilter { public void OnAuthorization(AuthorizationContext filterContext) { } }
我们看到OnAuthorization方法返回一个AuthorizationContext对象,它的属性如下:
名称 | 类型 | 说明 |
---|---|---|
ActionDescriptor | ActionDescriptor | 提供 System.Web.Mvc.AuthorizeAttribute 特性标记的操作方法的相关信息,如操作方法的名称、控制器、参数、特性和筛选器。 |
Result | ActionResult | 获取或设置由操作方法返回的结果。 |
不是一般只用继承
IAuthorizationFilter接口就行了么,为什么还要继承
FilterAttribute类呢?
我们先来看看这个类的含义
FilterAttribute 类 表示操作和结果筛选器特性的基类。 通常,可以通过创建从抽象 FilterAttribute 类继承的特性类来创建筛选器。 一些内置操作筛选器(如 AuthorizeAttribute 和 HandleErrorAttribute)是从 FilterAttribute 类继承的。 其他操作筛选器(如 OutputCacheAttribute)是从抽象 ActionFilterAttribute 类继承的,这使操作筛选器可在操作方法运行之前或之后运行。 你可以使用筛选器特性标记任何操作方法或控制器。 如果特性标记了某个控制器,则筛选器将应用于该控制器中的所有操作方法。
那么我们再看看不加这个类会发生什么
是的我们发现如果不继承于FilterAttribute类,我们无法在需要进行权限验证的方法前打上标记
接着我们之前实现的OnAuthorization方法具体有什么作用呢?
OnAuthorization方法在我们执行我们所要调用的方法之前调用,我们主要的判断权限逻辑写在这里
那么基础的部分我们就介绍完了下面我们简单的实现过滤器看看。
我们在的OnAuthorization中去做判断,如果访问地址是我们本地那么我们返回登录页
public void OnAuthorization(AuthorizationContext filterContext) { if (filterContext.HttpContext.Request.IsLocal) { var Url = new UrlHelper(filterContext.RequestContext); var url = Url.Action("Login", "Account"); filterContext.Result = new RedirectResult(url); } }
我们来看一看效果
我们看到这样我们的授权功能就实现了
另一种实现方式
当然我们除了自己实现IAuthenticationFilter接口外还有一种方式是我们可以通过继承与MVC自带的AuthorizeAttribute类来实现这个功能,当然比如我要实现之前我们实现地功能我们可以这样写。同样的我们添加一个新的过滤器LoginsAuthAttribute还是添加在之前的文件夹中,然后我们添加如下代码
private bool localAllowed; public LoginsAuthAttribute(bool allowedParam) { localAllowed = allowedParam; } protected override bool AuthorizeCore(HttpContextBase httpContext) { if (httpContext.Request.IsLocal) { return localAllowed; } else { return true; } }
我们通过重写AuthorizeCore方法来实现一个布尔类型的值来觉定用户是否授权,我们在这个过滤器中增加了一个参数,我们也可以通过这个参数来决定这个用户是否需要授权才能使用方法。
比如我们这样调用那么用户就必须实现我们的授权逻辑才能访问页面否则就会返回到登录页
[LoginsAuth(false)] public ActionResult About() { return View(); }
好了,我们本次的授权过滤器就先讲到这里了,当然这些只是基础用法,如果您有好的意见或者建议,也可以在评论中留言,如果觉得我的博客对你有帮助也可以点赞支持,您的鼓励是我最大的动力:)
相关文章推荐
- 笨鸟先飞之ASP.NET MVC系列之过滤器(01过滤器简介)
- 笨鸟先飞之ASP.NET MVC系列之过滤器(05结果过滤器)
- 笨鸟先飞之ASP.NET MVC系列之过滤器(03动作过滤器过滤器)
- 笨鸟先飞之ASP.NET MVC系列之过滤器(06异常过滤器)
- 笨鸟先飞之ASP.NET MVC系列之过滤器(04认证过滤器)
- 【ASP.NET MVC系列】浅谈ASP.NET MVC资源过滤和授权
- 成员资格、授权 – ASP.NET MVC 4 系列
- ASP.NET Identity系列02,在ASP.NET MVC中增删改查用户
- 学习ASP.NET MVC系列 - 还有比这更简炼的吗?把复杂的事情变简单了,贡献啊!
- ASP.NET MVC过滤器
- ASP.NET MVC ,WebAPI 自定义Basic授权方式
- ASP.NET MVC 过滤器Filter
- 《ASP.NET MVC 入门系列教程》索引贴
- 从0开始学习ASP.NET(2.0为例)系列——02开天辟地
- Asp.net mvc +Ajax +Extjs+NHibernate 系列之数据库DAO,Bussiness,Service三层
- ASP.NET MVC框架开发系列课程一
- 一步一步Asp.Net MVC系列_权限管理设计起始篇
- ASP.NET MVC框架开发系列课程二
- ASP.NET MVC 随想录——探索ASP.NET Identity 身份验证和基于角色的授权,中级篇