在.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 #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:\src\packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.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"]; } }
还有就是自定义权限处理的时候,写法也不尽相同,后续文章会进行介绍