当前位置:首页 > 企业简介 >

[ASP.NET MVC] 利用自定义的AuthenticationFilter实现

发布时间:2017-09-11 14:19:27 作者:陕西誉丰源物资有限公司

[ASP.NET MVC] 利用自定义的AuthenticationFilter实现Basic认证 很多情况下目标Action方法都要求在一个安全上下文中被执行,这里所谓的安全上下文主要指的是当前请求者是一个经过授权的用户。授权的本质就是让用户在他许可的权限范围内做他能够做的事情,授权的前提是请求者是一个经过认证的用户。质询-应答(Chanllenge-Response)”是用户认证采用的一种常用的形式,认证方向被认证方发出质询以要求其提供用于实施认证的用户凭证,而被认证方提供相应的凭证以作为对质询的应答。旨在目标Action方法执行之前实施身分认证的AuthenticationFilter也对这种认证方法提供了支持。

一、IAuthenticationFilter接口

所有的AuthenticationFilter类型均实现了IAuthenticationFilter接口,该接口定义在命名空间“System.Web.Mvc.Filters”下(其他四种过滤器接口都定义在“System.Web.Mvc”命名空间下)。如下面的代码片断所示,OnAuthentication和OnAuthenticationChallenge这两个方法被定义在此接口中,前者用于对请求实施认证,后者则负责将相应的认证质询发送给请求者。

1: public interface IAuthenticationFilter

2: {

3: void OnAuthentication(AuthenticationContext filterContext);

4: void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext);

5: }

定义在IAuthenticationFilter接口的两个方法都将一个上下文对象作为其唯一参数。OnAuthentication方法的这个参数类型为AuthenticationContext,如下面的代码片断所示,它是ControllerContext的子类。AuthenticationContext的ActionDescriptor返回的自然是用于描述目标Action方法的ActionDescriptor对象。借助于Principal属性,专题系统,我们可以获取或设置代表当前用户的Principal对象。如果我们在执行OnAuthentication方法的过程中设置了AuthenticationContext的Result属性,提供的ActionResult将直接用于响应当前请求。

1: public class ActionExecutingContext : ControllerContext

2: {

3: public ActionExecutingContext();

4: public ActionExecutingContext(ControllerContext controllerContext, ActionDescriptor actionDescriptor,IDictionary<string, object> actionParameters);

5:

6: public virtual ActionDescriptor ActionDescriptor { get; set; }

7: public virtual IDictionary<string, object> ActionParameters { get; set; }

8: public ActionResult Result { get; set; }

9: }

OnAuthenticationChallenge方法的参数类型为AuthenticationChallengeContext。如下面的代码片断所示,它依然是ControllerContext的子类。它同样具有一个用于描述目标Action方法的ActionDescriptor属性,其Result属性代表的ActionResult对象将用于响应当前请求。

1: public class ActionExecutedContext : ControllerContext

2: {

3: public ActionExecutedContext();

4: public ActionExecutedContext(ControllerContext controllerContext, ActionDescriptor actionDescriptor, bool canceled, Exception exception);

5:

6: public virtual ActionDescriptor ActionDescriptor { get; set; }

7: public virtual bool Canceled { get; set; }

8: public virtual Exception Exception { get; set; }

9: public bool ExceptionHandled { get; set; }

10: public ActionResult Result { get; set; }

11: }

二、AuthenticationFilter的执行流程

我们知道身份认证总是对请求处理的第一个步骤,因为只有确定了请求者的真实身份,安全才能得到保障,所以AuthenticationFilter是最先被执行的一类过滤器。所有过滤器的执行都是ActionInvoker来驱动的,ASP.NET MVC在默认情况下采用的ActionInvoker是一个AsyncControllerActionInvoker对象,后者类型派生于ControllerActionInvoker。ControllerActionInvoker针对AuthenticationFilter的执行体现在如下两个方法(InvokeAuthenticationFilters和InvokeAuthenticationFiltersChallenge)上。

1: public class ControllerActionInvoker : IActionInvoker

2: {

3: //其他成员

4: protected virtual AuthenticationContext InvokeAuthenticationFilters(ControllerContext controllerContext,IList<IAuthenticationFilter> filters, ActionDescriptor actionDescriptor);

5: protected virtual AuthenticationChallengeContext InvokeAuthenticationFiltersChallenge(ControllerContext controllerContext, IList<IAuthenticationFilter> filters, ActionDescriptor actionDescriptor, ActionResult result);

6: }

如果多个AuthenticationFilter同时被应用到目标Action方法上,ControllerActionInvoker会根据对应Filter的Order/Scope属性对它们进行排序。随后ControllerActionInvoker会根据当前ControllerContext、描述目标Action方法的ActionDescriptor对象以及原始的Principal(对应于当前HttpContext的User属性)创建一个AuthenticationContext对象,并以此作为参数以此调用每个AuthenticationFilter对象的OnAuthentication对象实施认证。

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:鄂州SEO http://ezhou.raoyu.net

  • 上一篇:第14章3节《MonkeyRunner源码剖析》 HierarchyViewer
  • 下一篇:最后一页