概念介绍

认证过滤器是MVC5的新特性,它有一个相对复杂的生命周期,它在其他所有过滤器之前运行,我们可以在认证过滤器中创建一个我们定义的认证方法,也可以结合授权过滤器做一个复杂的认证方法,这个方法可以不准守授权规则。认证过滤器还可以在一个动作方法执行后,处理前运行。

如果我们需要创建认证过滤器需要实现IAuthenticationFilter接口。

namespace System.Web.Mvc.Filters
{//// 摘要://     定义一个用于执行身份验证的筛选器。public interface IAuthenticationFilter{//// 摘要://     对请求进行身份验证。//// 参数://   filterContext://     用于身份验证的上下文。void OnAuthentication(AuthenticationContext filterContext);//// 摘要://     向当前 System.Web.Mvc.ActionResult 添加身份验证质询。//// 参数://   filterContext://     用于身份验证质询的上下文。void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext);}
}

我们看到该接口里有两个方法OnAuthenticationOnAuthenticationChallenge,前者在运行其他类型的过滤器之前调用,后者无论对认证的请求或对动作方法授权的请求失败都会调用

OnAuthentication方法

我们已经知道了OnAuthentication方法在所有过滤器运用之前被调用,在OnAuthentication方法中传递的参数是一个AuthenticationContext对象,它继承于ControllerContext类,它的属性如下:

名称 类型 说明
ActionDescriptor ActionDescriptor 获取或设置操作描述符。
Principal IPrincipal 获取或设置当前已进行身份验证的主体。
Result ActionResult 获取或设置由操作方法返回的结果。

执行OnAuthentication方法

下面我将演示OnAuthentication方法,首先我们还是在之前的Filter文件夹下添加一个名为 CustomAuthAttribute.cs 的过滤器类,我们继承 FilterAttribute 类和 IAuthenticationFilter 接口,为了方便演示,我们简单处理,判断请求类型,如果是本地请求那么我们让其回到登录页。

这是我们在_CustomAuthAttribute.cs_ 文件中编写的代码

public class CustomActionAttribute : FilterAttribute, IActionFilter{public void OnAuthentication(AuthenticationContext filterContext){var user = filterContext.HttpContext.Request.IsLocal;if (user){var Url = new UrlHelper(filterContext.RequestContext);var url = Url.Action("Login", "Account");filterContext.Result = new RedirectResult(url);}}public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext){}}

接着我们在Home控制器里修改About()方法,在方法上方加上我们的过滤器

        [CustomAuth]public ActionResult About(){ViewBag.Message = "Your application description page.";return View();}

好了我们运行程序,看看效果

OnAuthenticationChallenge方法

OnActionExecuted方法无论对认证的请求或对动作方法授权的请求失败都会调用那么听上去很绕口具体概述就是如果设置了IAuthenticationFilter,则会调用OnAuthentication方法
在OnAuthentication中如果设置了filterContext的Result,则会直接跳转到OnAuthenticationChallenge方法。
如果OnAuthentication中没有设置filterContext的Result,则交由授权过滤器处理。如果没有设置授权过滤器,那么
IAuthenticationFilter的OnAuthenticationChallenge方法始终会在ActionResult的ExecuteResult执行之前运行。

名称 类型 说明
ActionDescriptor ActionDescriptor 获取或设置操作描述符。
Canceled bool 获取或设置一个值,该值指示此ActionExecutedContext 对象已被取消。
Exception Exception 获取或设置在操作方法的执行过程中发生的异常(如果有)。
ExceptionHandled bool 获取或设置一个值,该值指示是否处理异常。
Result ActionResult 获取或设置由操作方法返回的结果。

执行OnAuthenticationChallenge方法

我们可以通过OnAuthenticationChallenge方法来执行未授权的补充方法,比如我们这里简单演示本地请求的方法直接返回首页,当然这种做法很蠢,只做演示,实际过程中请不要尝试。我们修改 CustomAuthAttribute.cs 过滤器代码如下:

public class CustomActionAttribute : FilterAttribute, IActionFilter{public void OnAuthentication(AuthenticationContext filterContext){var user = filterContext.HttpContext.Request.IsLocal;if (user){var Url = new UrlHelper(filterContext.RequestContext);var url = Url.Action("Login", "Account");filterContext.Result = new RedirectResult(url);}}public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext){var user = filterContext.HttpContext.Request.IsLocal;if (user){var Url = new UrlHelper(filterContext.RequestContext);var url = Url.Action("Index", "Home");filterContext.Result = new RedirectResult(url);}}}

我们再来看看效果

总结

认证过滤器一般我们用的比较少,多数都会使用授权过滤器实现功能,但是认证过滤器在授权过滤器之前执行,对此我们可以用认证过滤器在授权过滤器对请求做认证,判断此请求能否通过认证去执行授权过滤器,当然对于一些临时的可通过的请求,我们也可以通过认证过滤器的OnAuthenticationChallenge方法让其通过。

转载于:https://www.cnblogs.com/chen-jie/p/APS-NET-MVC-AuthenticationFilter.html

笨鸟先飞之ASP.NET MVC系列之过滤器(04认证过滤器)相关推荐

  1. 学习ASP.NET MVC系列 - 还有比这更简炼的吗?把复杂的事情变简单了,贡献啊!...

    转自 学习ASP.NET MVC系列: 学习ASP.NET MVC(一)--我的第一个ASP.NET MVC应用程序 学习ASP.NET MVC(二)--我的第一个ASP.NET MVC 控制器 学习 ...

  2. (转)一步一步Asp.Net MVC系列_权限管理设计起始篇

    原文地址:http://www.cnblogs.com/mysweet/archive/2012/07/26/2610793.html 前一段时间,写了一步一步asp.net的一系列博客,最近,也快要 ...

  3. [asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?

    在QQ群或者一些程序的交流平台,经常会有人问:我怎么传一个数组在Action中接收.我传的数组为什么Action的model中接收不到.或者我在ajax的data中设置了一些数组,为什么后台还是接收不 ...

  4. Asp.Net MVC学习总结(三)——过滤器你怎么看?

    一.过滤器简介 1.1.理解什么是过滤器 1.过滤器(Filters)就是向请求处理管道中注入额外的逻辑.提供了一个简单而优雅的方式来实现横切关注点. 2.所谓的过滤器(Filters),MVC框架里 ...

  5. ASP.NET MVC系列:添加控制器

    基于MVC的应用程序包含三个部分 Models(模型):对应用程序的数据进行处理 Views(视图):动态生成HTML,显示数据 Controllers(控制器):应用程序中处理用户交互的部分,处理浏 ...

  6. ASP.NET MVC系列:UrlRouting

    1. URLRouting简介   URL(Uniform Resource Locator),统一资源定位器,是用于完整描述Internet上的网页或其他资源地址的一种标识方法. URL一般可以由6 ...

  7. [ASP.NET MVC 小牛之路]04 - 依赖注入(DI)和Ninject

    特别提醒:本文编写时间是 2013 年,请根据目前 .NET 发展接收你所需的知识点. 为什么需要依赖注入 在[ASP.NET MVC 小牛之路]系列的理解MVC模式文章中,我们提到MVC的一个重要特 ...

  8. (转)一步一步Asp.Net MVC系列_权限管理之权限控制

    原文地址:http://www.cnblogs.com/mysweet/archive/2012/08/05/2623687.html 在权限管理中一个很重要的就是关于权限的拦截验证问题,特别是我们在 ...

  9. 一步一步Asp.Net MVC系列_权限管理总结(附MVC权限管理系统源码)

    TZHSWEET:请大家多多反馈问题,我已经在修改中了,已更新版本...... 如果大家遇到数据库附加问题,EF连接字符串问题,请自行配置,如果有bug反馈可以私聊,我的qq:409180955. 项 ...

  10. 【.NET特供-第三季】ASP.NET MVC系列:传统WebForm站点和MVC站点执行机制对照

    本文以图形化的方式,从'执行机制'方面对照传统WebForm站点和MVC站点. 请參看下面图形: 一.执行机制 当我们訪问一个站点的时候,浏览器和server都是做了哪些动作呢? (本文仅仅是提供一个 ...

最新文章

  1. 线程安全之strtok()函数
  2. win 修改jvm时间_Windows 下修改Tomcat jvm参数
  3. python 怎么算l2范数_数学推导+纯Python实现机器学习算法13:Lasso回归
  4. Nginx限制连接数和下载速度
  5. 海思3519A配置IP
  6. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_17_常用的函数式接口_Function接口中的方法andThen...
  7. hive 日誌怎麼查看_Hive日志调试 | 学步园
  8. 微信小程序蓝牙ibeacon_微信小程序的新接口 – 蓝牙
  9. 三相全桥整流电路_三相桥式全控整流电路原理及电路图
  10. 【移动安全高级篇】————2、浅谈Android软件安全自动化审计
  11. android 带刻度的滑动条_Android实现滚动刻度尺效果
  12. enumerate使用方法
  13. 您的美团账户,美团互助未经客户同意自动扣费0.01元是什么情况
  14. 制作抖音卡点视频?Python来帮你~
  15. Spring源码学习第四天==>初识Refresh()
  16. java web分享ppt大纲 -- servlet容器简介
  17. node-red教程6 串口控件的使用
  18. codewarrior烧录,34704B_freescalecodewarrior烧写程序
  19. FPGA 顶层图纸.bdf文件设计、LPM
  20. mega2560开发板

热门文章

  1. EXCEL怎样完整显示身份证号码
  2. 演示账号激活的过程:注册——向指定邮箱发送邮件——用户登录邮箱,激活账号
  3. element table多选和单选
  4. 未处理System.BadImageFormatException,试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)
  5. C#中执行SQL语句
  6. 使用EqualsBuilder和HashCodeBuilder生成hashcode和equal方法
  7. JasperReport 导出PDF不能加载
  8. nginx 开机启动_4步配置Nginx + Keepalived + Havip,解决前端单点问题
  9. java tmp 目录_Tmp目录丢失引发Java进程异常
  10. python中darks_YOLOv4: Darknet 如何于 Ubuntu 编译,及使用 Python 接口