• 爱上MVC~AuthorizeAttribute验证不通过如何停止当前上下文


    回到目录

    我们知道mvc里有一些过滤器,AuthorizeAttribute用来做授权,一般在用户授权方面可以使用它,当使用没有登陆,我们直接跳到登陆页,这是没有问题的,可我要说的是,当用户对某个Action没有权限时,如何禁止对当前action的执行,这个听起来很不可思议,因为我们一般感觉,当AuthorizeAttribute验证不通过后,它的当前action也不会被执行,可事实并非如此!

    看下面代码

            public override void OnAuthorization(AuthorizationContext filterContext)
            {
                #region 例外
                bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true) ||
                                         filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true) ||
                                         filterContext.RequestContext.HttpContext.Request.Url.Host == "localhost";
    
                if (skipAuthorization)
                    return;
                #endregion
    
                //当前为正常页面,不是分布视图
                var isValid = false;
                //当前用户的菜单和权限
                var menuAuthority = Lind.DDD.Utils.SerializeMemoryHelper.DeserializeFromJson<List<Tuple<int, string, int>>>(CurrentUser.ExtInfo);
                //当前控制器对应的权限值
                var controllerName = filterContext.RouteData.Values["controller"].ToString();
                var actionName = filterContext.RouteData.Values["action"].ToString();
                //当前权限,先找完全匹配的,如果没有,再找controller匹配的
                var current = menuAuthority.Find(i => !string.IsNullOrWhiteSpace(i.Item2)
                    && i.Item2.ToLower() == ("/" + controllerName + "/" + actionName).ToLower());
    
                if (current != null)
                {
                    if ((current.Item3 & (int)Authority) == (int)Authority)
                    {
                        isValid = true;
                    }
                }
    
                if (!isValid)
                {
    
                    string returnUrl = filterContext.RequestContext.HttpContext.Request.UrlReferrer == null ? "/AdminCommon/LogOn" : filterContext.RequestContext.HttpContext.Request.UrlReferrer.AbsolutePath;
                    filterContext.RequestContext.HttpContext.Response.Write("<div style='text-align:center'><div style='MARGIN-RIGHT: auto;MARGIN-LEFT: auto;300px;min-height:150px;border: 2px dashed #aaa;color: red; font-size: 14px;padding: 5px;text-align: center;vertical-align:middle;'><h2>警告</h2><p>您没有被授权此操作,请<a href=" + returnUrl + ">单击返回</a></p><p style='color:#000'>时间:" + DateTime.Now + "</p></div></div>");
                    filterContext.RequestContext.HttpContext.Response.End();
                    filterContext.Result = new EmptyResult();//清空当前Action,不执行当前Action代码
    
                }
            }

    上面代码是大叔在进行权限设计时用到的,请注意最后一句EmptyResult,这个方法表示返回一个空的Actioin的结果,只有加上这个空结果,你的当前Action才不会被执行,大叔觉得,这是一种架构设计的新思想,像没多架构都使用了这种空对象的技术,空对象即什么事件都不做,但它并不是null!

      // 摘要:
        //     表示一个不执行任何操作的结果,如不返回任何内容的控制器操作方法。
        public class EmptyResult : ActionResult
        {
            // 摘要:
            //     初始化 System.Web.Mvc.EmptyResult 类的新实例。
            public EmptyResult();
    
            // 摘要:
            //     执行指定的结果上下文。
            //
            // 参数:
            //   context:
            //     结果上下文。
            public override void ExecuteResult(ControllerContext context);
        }

    感觉各位对大叔的支持!

    回到目录

  • 相关阅读:
    刘备和诸葛亮闹翻:无意说出蜀国灭亡的根源?
    亚马逊为什么能吞噬世界?贝索斯有这么一种独特的战略思维
    现在的社会,能负债的人,一定是有本事的人
    富士康为何转向美国:人口红利消失 炒房带来恶性循环
    中国华为:硅谷风混搭国企作派
    亚马逊拟斥资15亿美元建航空货运中心
    比数字工具更好用的纸和笔
    张小龙的克制 小程序 微信
    阿里前CEO卫哲用自己10余年经历,倾诉B2B的三差、四率、两大坑
    关于自信的励志名言
  • 原文地址:https://www.cnblogs.com/lori/p/5903675.html
Copyright © 2020-2023  润新知