zoukankan      html  css  js  c++  java
  • ASP.NET WebApi总结之自定义权限验证

    在.NET中有两个AuthorizeAttribute类,

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

    #region 程序集 System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
    // E:srcpackagesMicrosoft.AspNet.WebApi.Core.5.2.3lib
    et45System.Web.Http.dll
    #endregion
    
    using 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:srcpackagesMicrosoft.AspNet.Mvc.5.2.3lib
    et45System.Web.Mvc.dll
    #endregion
    
    namespace 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"];
          }
    }

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

  • 相关阅读:
    CSZ CMS 1.2.7 xss分析与复现
    蚁剑改造过WAF系列(一)
    代理池
    二维码劫持案例分析
    入门KKCMS代码审计
    Xposed+XServer无需脱壳抓取加密包
    通达OA前台任意用户登录分析
    ATutor学习内容管理系统任意文件上传漏洞(CVE-2019-12169)分析
    调试System.AggregateException-即使在异步代码中也是如此
    关于System.Exception
  • 原文地址:https://www.cnblogs.com/buyixiaohan/p/8278544.html
Copyright © 2011-2022 走看看