角色限制(AuthorizeAttribute)

首选,我看网上很多说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()这一个方法  在里面完成所有操作
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值