概念介绍

认证过滤器是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方法让其通过。

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

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

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

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

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

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

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

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

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

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

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

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

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

  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单元测试之JUnit篇

    单元测试是编写测试代码,应该准确.快速地保证程序基本模块的正确性. 好的单元测试的标准 JUnit是Java单元测试框架,已经在Eclipse中默认安装. JUnit4 JUnit4通过注解的方式来识 ...

  2. 201521123036 《Java程序设计》第6周学习总结

    本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 1.2 可选:使用常规方法总结其他上课内容. 对象克隆:Clon ...

  3. 201521123060 《Java程序设计》第5周学习总结

    1.本周学习总结 2.书面作业 Q1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 答:不能 ...

  4. 201521123093 java 第四周学习总结

    1.平面作业 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 答:1.类与方法的注释 2.super关键字代表的是父类,super.方法表示调用的是父类 2. ...

  5. 201521123101 《Java程序设计》第3周学习总结

    1. 本周学习总结 2. 书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; p ...

  6. 201521123069 《Java程序设计》 第2周学习总结

    1. 本章学习总结 (1)String类.StringBuilder类(频繁进行字符串的修改应选用StringBuilder,不会生成大量的字符串对象).Math类的用法.字符串池的概念 (2)Sca ...

  7. Android Studio不更新到最新版使用Kotlin

    第一步:安装Kotlin插件 打开Settings面板,找到Plugins选项,点击Browse repositories(浏览仓库),输入“Kotlin”查找,然后安装即可.安装完成之后需要重启An ...

  8. Hibernate第九篇【组件映射、继承映射】

    前言 到目前位置,我们已经学习了一对一.一对多.多对一.多对多映射了-既然Hibernate是ORM实现的框架,它还提供了组件映射和继承映射..本博文主要讲解组件映射和继承映射 Java主要的类主要有 ...

  9. Oracle中Union与Union All的区别(适用多个数据库)

    Oracle中Union与Union All的区别(适用多个数据库) 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或 ...

  10. 《Java从入门到放弃》JavaSE入门篇:练习——单身狗租赁系统

    今天,我们要玩个大的!!! 我们把之前使用数组做的这个单身狗系统改版成数据库版本,并且使用面向对象里面的一些简单思想.如果有不知道这个系统的看官,请跳转到目录页,然后再选择单身狗系统(数组版)先围观五 ...