ASP.NET WebApi总结之自定义权限验证

2018-01-13 11:42:08来源:cnblogs.com作者:天北涯人点击

分享

在.NET中有两个AuthorizeAttribute类,

一个定义在System.Web.Http命名空间下

#region 程序集 System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35// E:/src/packages/Microsoft.AspNet.WebApi.Core.5.2.3/lib/net45/System.Web.Http.dll#endregionusing System.Web.Http.Controllers;using System.Web.Http.Filters;namespace System.Web.Http{    //    // 摘要:    //     指定用于验证请求的 System.Security.Principal.IPrincipal 的授权筛选器。    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]    public class AuthorizeAttribute : AuthorizationFilterAttribute    {        //        // 摘要:        //     初始化 System.Web.Http.AuthorizeAttribute 类的新实例。        public AuthorizeAttribute();        //        // 摘要:        //     获取或设置授权角色。        //        // 返回结果:        //     角色字符串。        public string Roles { get; set; }        //        // 摘要:        //     获取此特性的唯一标识符。        //        // 返回结果:        //     此特性的唯一标识符。        public override object TypeId { get; }        //        // 摘要:        //     获取或设置授权用户。        //        // 返回结果:        //     用户字符串。        public string Users { get; set; }        //        // 摘要:        //     为操作授权时调用。        //        // 参数:        //   actionContext:        //     上下文。        //        // 异常:        //   T:System.ArgumentNullException:        //     上下文参数为 null。        public override void OnAuthorization(HttpActionContext actionContext);        //        // 摘要:        //     处理授权失败的请求。        //        // 参数:        //   actionContext:        //     上下文。        protected virtual void HandleUnauthorizedRequest(HttpActionContext actionContext);        //        // 摘要:        //     指示指定的控件是否已获得授权。        //        // 参数:        //   actionContext:        //     上下文。        //        // 返回结果:        //     如果控件已获得授权,则为 true;否则为 false。        protected virtual bool IsAuthorized(HttpActionContext actionContext);    }}

另一个在System.Web.Mvc命名空间下

#region 程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35// E:/src/packages/Microsoft.AspNet.Mvc.5.2.3/lib/net45/System.Web.Mvc.dll#endregionnamespace System.Web.Mvc{    //    // 摘要:    //     指定对控制器或操作方法的访问只限于满足授权要求的用户。    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]    public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter    {        //        // 摘要:        //     初始化 System.Web.Mvc.AuthorizeAttribute 类的新实例。        public AuthorizeAttribute();        //        // 摘要:        //     获取或设置有权访问控制器或操作方法的用户角色。        //        // 返回结果:        //     有权访问控制器或操作方法的用户角色。        public string Roles { get; set; }        //        // 摘要:        //     获取此特性的唯一标识符。        //        // 返回结果:        //     此特性的唯一标识符。        public override object TypeId { get; }        //        // 摘要:        //     获取或设置有权访问控制器或操作方法的用户。        //        // 返回结果:        //     有权访问控制器或操作方法的用户。        public string Users { get; set; }        //        // 摘要:        //     在过程请求授权时调用。        //        // 参数:        //   filterContext:        //     筛选器上下文,它封装有关使用 System.Web.Mvc.AuthorizeAttribute 的信息。        //        // 异常:        //   T:System.ArgumentNullException:        //     filterContext 参数为 null。        public virtual void OnAuthorization(AuthorizationContext filterContext);        //        // 摘要:        //     重写时,提供一个入口点用于进行自定义授权检查。        //        // 参数:        //   httpContext:        //     HTTP 上下文,它封装有关单个 HTTP 请求的所有 HTTP 特定的信息。        //        // 返回结果:        //     如果用户已经过授权,则为 true;否则为 false。        //        // 异常:        //   T:System.ArgumentNullException:        //     httpContext 参数为 null。        protected virtual bool AuthorizeCore(HttpContextBase httpContext);        //        // 摘要:        //     处理未能授权的 HTTP 请求。        //        // 参数:        //   filterContext:        //     封装有关使用 System.Web.Mvc.AuthorizeAttribute 的信息。filterContext 对象包括控制器、HTTP 上下文、请求上下文、操作结果和路由数据。        protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext);        //        // 摘要:        //     在缓存模块请求授权时调用。        //        // 参数:        //   httpContext:        //     HTTP 上下文,它封装有关单个 HTTP 请求的所有 HTTP 特定的信息。        //        // 返回结果:        //     对验证状态的引用。        //        // 异常:        //   T:System.ArgumentNullException:        //     httpContext 参数为 null。        protected virtual HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext);    }}

两者主要区别在于:

  • System.Web.Http 这个主要是用在Web Api
  • System.Web.Mvc 这个主要用在 ASP.NET MVC
  • System.Web.Http 版本中,传入参数为HttpActionContext
    public override void OnAuthorization(HttpActionContext actionContext);

    System.Web.Mvc版本中,传入参数为AuthorizationContext

    public virtual void OnAuthorization(AuthorizationContext filterContext);

看似相同,但是在处理自定义权限的时候,两者思路相近实际实现方式上有很大的差别。

下面列出两种属性下获取Cookie的不同:

MVC:

public class Foo : AuthorizeAttribute{     public override void OnAuthorization(AuthorizationContext filterContext)      {          HttpCookie cookie = filterContext.HttpContext.Request.Cookies.Get("Bar");         }}

HTTP(Web Api):

public class Foo : AuthorizeAttribute{      public override void OnAuthorization(HttpActionContext actionContext)      {           var cookies = actionContext.Request.Headers.GetCookies("Bar").FirstOrDefault();           var cookie = cookies["Bar"];      }}

还有就是自定义权限处理的时候,写法也不尽相同,后续文章会进行介绍

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台