首选,我看网上很多说System.Web.Mvc.AuthorizeAttribute的,有的只讲了用法,内部方法没有讲清,还有的说的太专业对于底层研究不深的朋友很不友好,因为这篇只是根据本人的胃口对MVC的这个组件进行整理
1.在网上看的资料 说以下的两块代码是 AuthorizeAttribute中,OnAuthorization和AuthorizeCore方法的源码 ,是不是源码我不清楚,如果小伙伴在其他平台有其它源代码请告知我,咱们全当源码分析吧
AuthorizeAttribute的执行方法是 如果某一控制器被标记Attribute,则来自于http的访问变会首先被过滤,第一步就是执行OnAuthorization();
public virtual void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (OutputCacheAttribute.IsChildActionCacheActive(filterContext))
{
throw new InvalidOperationException(MvcResources.AuthorizeAttribute_CannotUseWithinChildActionCache);
}
bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true)
|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true);
if (skipAuthorization)
{
return;
}
if (AuthorizeCore(filterContext.HttpContext))
{
HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
cachePolicy.SetProxyMaxAge(new TimeSpan(0));
cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */);
}
else
{
HandleUnauthorizedRequest(filterContext);
}
}
protected virtual bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext == null)
{
throw new ArgumentNullException("httpContext");
}
IPrincipal user = httpContext.User;
if (!user.Identity.IsAuthenticated)
{
return false;
}
if (_usersSplit.Length > 0 && !_usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase))
{
return false;
}
if (_rolesSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole))
{
return false;
}
return true;
}
```我们可以看到OnAuthorization方法中 在一系列的非空,缓存等验证后调用了AuthorizeCore权限验证方法,如果验证通过则出方法,如果不通过则调用HandleUnauthorizedRequest()方法
因此我们在自己的继承类可以从写这三个方法达到权限验证
OnAuthorization()为入口方法
AuthorizeCore()验证方法
HandleUnauthorizedRequest()验证失败后的跳转路径
当然我们可以只从写OnAuthorization()这一个方法 在里面完成所有操作