概念介绍

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

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

  1. namespace System.Web.Mvc.Filters
  2. {
  3. //
  4. // 摘要:
  5. // 定义一个用于执行身份验证的筛选器。
  6. public interface IAuthenticationFilter
  7. {
  8. //
  9. // 摘要:
  10. // 对请求进行身份验证。
  11. //
  12. // 参数:
  13. // filterContext:
  14. // 用于身份验证的上下文。
  15. void OnAuthentication(AuthenticationContext filterContext);
  16. //
  17. // 摘要:
  18. // 向当前 System.Web.Mvc.ActionResult 添加身份验证质询。
  19. //
  20. // 参数:
  21. // filterContext:
  22. // 用于身份验证质询的上下文。
  23. void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext);
  24. }
  25. }

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

OnAuthentication方法

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

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

执行OnAuthentication方法

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

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

  1. public class CustomActionAttribute : FilterAttribute, IActionFilter
  2. {
  3. public void OnAuthentication(AuthenticationContext filterContext)
  4. {
  5. var user = filterContext.HttpContext.Request.IsLocal;
  6. if (user)
  7. {
  8. var Url = new UrlHelper(filterContext.RequestContext);
  9. var url = Url.Action("Login", "Account");
  10. filterContext.Result = new RedirectResult(url);
  11. }
  12. }
  13. public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
  14. {
  15. }
  16. }

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

  1. [CustomAuth]
  2. public ActionResult About()
  3. {
  4. ViewBag.Message = "Your application description page.";
  5. return View();
  6. }

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

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 过滤器代码如下:

  1. public class CustomActionAttribute : FilterAttribute, IActionFilter
  2. {
  3. public void OnAuthentication(AuthenticationContext filterContext)
  4. {
  5. var user = filterContext.HttpContext.Request.IsLocal;
  6. if (user)
  7. {
  8. var Url = new UrlHelper(filterContext.RequestContext);
  9. var url = Url.Action("Login", "Account");
  10. filterContext.Result = new RedirectResult(url);
  11. }
  12. }
  13. public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
  14. {
  15. var user = filterContext.HttpContext.Request.IsLocal;
  16. if (user)
  17. {
  18. var Url = new UrlHelper(filterContext.RequestContext);
  19. var url = Url.Action("Index", "Home");
  20. filterContext.Result = new RedirectResult(url);
  21. }
  22. }
  23. }

我们再来看看效果

总结

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

笨鸟先飞之ASP.NET MVC系列之过滤器(04认证过滤器)的更多相关文章

  1. 笨鸟先飞之ASP.NET MVC系列之过滤器(02授权过滤器)

    授权过滤器 概念介绍 在之前的文章中我们已经带大家简单的了解了下过滤器,本次我们开始介绍授权过滤器. 我们之前提到过授权过滤器在认证过滤器之后,其他过滤器和方法被调用之前运行,而授权过滤器和它名字的含 ...

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

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

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

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

  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. lnmp首次安装重置mysql密码

    第一种方法:一键修改LNMP环境下MYSQL数据库密码脚本 一键脚本肯定是非常方便.具体执行以下命令: wget http://soft.vpser.net/lnmp/ext/reset_mysql_ ...

  2. 百度地图坐标偏移,微信小程序地图偏移问题,腾讯地图坐标偏移

    解决方案: 如果用百度的地图获取的坐标点,在微信小程序内使用,就会出现偏移 算法(lat和lng是经纬度,球面坐标): To_B是转到百度,To_G是转到GCJ-02(谷歌,高德,腾讯) var TO ...

  3. 深入研究HTML5实现图片压缩上传

    上篇文章中提到移动端上传图片,我们知道现在流量还是挺贵的,手机的像素是越来越高,拍个照动不动就是好几M,伤不起.虽然客户端可以轻轻松松实现图片压缩再上传,但是我们的应用还可能在浏览器里面打开,怎么办呢 ...

  4. ajax小知识

    1.ajax发送get请求时,需要注意如下情况: var uri="http://127.0.0.1:8071/springmvcdemo/bigdataapi/publishdata&qu ...

  5. 【读书笔记】iOS-微定位技术

    在大型商场,医院或是大楼里,你是否曾经有过找不到想去的地方的经历呢?这种情况下采用传统的定位方法就有些力不从心了.首先这些地方不能采用GPS定们,而Wifi和蜂窝式移动电话基站定位误差比较大.这种情况 ...

  6. Vagrant安装配置

    转载自:https://my.oschina.net/u/3424381/blog/888205 Vagrant安装配置 实际上Vagrant只是一个让你可以方便设置你想要的虚拟机的便携式工具,它底层 ...

  7. 安卓开发_深入理解Activity和Fragment的关系

    Fragment(碎片)是必须嵌入在 Activity(活动) 中使用的.Fragment的生命周期随着Activity的生命周期的变化而变化 一.首先让我们看下Activity和Fragment的生 ...

  8. c#权限验证

    在开发过程中,需要对访问者的身份做权限验证(再filter中进行权限过滤). 在每次进入控制器方法之前进行调用:如 [ControllerAuth] [RoutePrefix("Clinic ...

  9. 利用RSACryptoServiceProvider进行RSA加密解密

    前言: 本文只介绍How to use,对于加密算法的研究不予讨论. 关于私钥的存储,微软给的建议是使用windows自带的秘钥容器,相见文档. 为了直观看到私钥和公钥,本文直接将其存入XML文件中. ...

  10. Chrome 如何让光标快速定位到地址栏-进行搜索

    我们经常花费大量的时间来进行使用浏览器搜索网页,如何进行高效的搜索,需要掌握一些快捷键: Windows: Ctrl + L 或 Alt + D 或 F6 Mac: Command + L Linux ...