授权过滤器

概念介绍

在之前的文章中我们已经带大家简单的了解了下过滤器,本次我们开始介绍授权过滤器。

我们之前提到过授权过滤器在认证过滤器之后,其他过滤器和方法被调用之前运行,而授权过滤器和它名字的含义一样主要是负责执行我们的授权逻辑,确保我们要调用的方法只被我们认证过的用户使用。

自定义授权过滤器

首先我们还是用之前创建的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系列之过滤器(02授权过滤器)的更多相关文章

  1. 笨鸟先飞之ASP.NET MVC系列之过滤器(04认证过滤器过滤器)

    概念介绍 认证过滤器是MVC5的新特性,它有一个相对复杂的生命周期,它在其他所有过滤器之前运行,我们可以在认证过滤器中创建一个我们定义的认证方法,也可以结合授权过滤器做一个复杂的认证方法,这个方法可以 ...

  2. 笨鸟先飞之ASP.NET MVC系列之过滤器(04认证过滤器)

    概念介绍 认证过滤器是MVC5的新特性,它有一个相对复杂的生命周期,它在其他所有过滤器之前运行,我们可以在认证过滤器中创建一个我们定义的认证方法,也可以结合授权过滤器做一个复杂的认证方法,这个方法可以 ...

  3. 笨鸟先飞之ASP.NET MVC系列之过滤器(01过滤器简介)

    过滤器 什么是过滤器? 过滤器(Filter) 主要的作用大致可以理解为把我们的附加逻辑注入到MVC框架的请求处理. 在ASP.NET MVC的请求处理中一种有19个管道事件分别是 BeginRequ ...

  4. 笨鸟先飞之ASP.NET MVC系列之过滤器(05结果过滤器)

    概念介绍 结果过滤器看名字就知道这个过滤器是针对方法所产生结果的,结果过滤器,主要在我们的动作方法结果返回前后执行. 如果我们需要创建结果过滤器需要实现IResultFilter接口. namespa ...

  5. 笨鸟先飞之ASP.NET MVC系列之过滤器(03动作过滤器过滤器)

    概念介绍 动作过滤器应该是我们平常工作中需要用到最多的过滤器了,动作过滤器,主要在我们的动作方法执行前后执行. 如果我们需要创建动作过滤器需要实现IActionFilter接口. 我们看到该接口里有两 ...

  6. 笨鸟先飞之ASP.NET MVC系列之过滤器(06异常过滤器)

    概念介绍 异常过滤器主要在我们方法中出现异常的时候触发,一般我们用 异常过滤器 记录日志,或者在产生异常时做友好的处理 如果我们需要创建异常过滤器需要实现IExceptionFilter接口. nam ...

  7. ASP.NET MVC 系列随笔汇总[未完待续……]

    ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...

  8. 【ASP.NET MVC系列】浅谈ASP.NET MVC 控制器

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  9. 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

随机推荐

  1. 我的Java起源

    2015年九月八号我和我爸一同去Java的培训学校,我是一名读了高一就不读的学生.抛弃高中就一个理由--不喜欢,是的,我不喜欢高中的课程.我不理解我一辈子不会出地球为什么我要学习那些内容,如果我就自己 ...

  2. JAVA实用案例之邮件发送

    最近有朋友问邮件怎么发送,就简单写了个demo,因为懒得找jar包,所以项目是创建的maven工程,具体的maven引用的jar如下: <dependency> <groupId&g ...

  3. 数据库学习任务一:使用vs2010建立数据库

    数据库应用程序的开发流程一般主要分为以下几个步骤: 创建数据库 使用Connection对象连接数据库 使用Command对象对数据源执行SQL命令并返回数据 使用DataReader和DataSet ...

  4. MPLS VPN随堂笔记1

    MPLS VPN 基础 1.MPLS vpn架构的特点 1.1.允许不同CE传递相同私网路由 1.2.SP内部(所有P路由器)不需要学习CE路由 1.3.无安全保障但有带宽保障(跟SP租用服务) 2. ...

  5. Web in Linux小笔记001

    Linux灾难恢复: Root密码修复 Centos single Filesystem是硬盘文件根目录,无法再cd ..就像macitosh 硬盘图标 Pwd:显示绝对路径 MBR修复 模拟MBR被 ...

  6. CCIE-MPLS VPN-实验手册(下卷)

    10:跨域的MPLS VPN (Option A) 10.1 实验拓扑 10.1 实验需求 a.       R1 R2 R3 组成P-NETWORK R1 R2 R3 位于AS 1,底层协议采用EI ...

  7. bootstrap导航条+模态对话框+分页样式

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  8. 201521123107 《Java程序设计》第4周学习总结

    第4周作业-面向对象设计与继承 1.本周学习总结 2.书面作业 1.注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) 对类的注释: 所得到的效果: ...

  9. 201521123071《Java程序设计》第五周学习总结

    第5周作业-继承.多态.抽象类与接口 1. 本周学习总结 1.1 思维导图总结: 1.2在本周的学习中,主要学习了以下几点: - 初步接触了接口的定义,用interface关键字定义接口,使用impl ...

  10. 201521123060《Java程序设计》第2周学习总结

    1. 本周学习总结 a.进一步熟悉了Eclipse的使用和java程序的编写: b.学习了java数据的基本类型:整数类型,浮点类型等: c.学习了算数运算符,赋值运算符,位运算符,关系运算符,逻辑运 ...