博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
爱上MVC~AuthorizeAttribute验证不通过如何停止当前上下文
阅读量:7232 次
发布时间:2019-06-29

本文共 2765 字,大约阅读时间需要 9 分钟。

我们知道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
>>(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("

警告

您没有被授权此操作,请单击返回

时间:" + DateTime.Now + "

"); 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);    }

感觉各位对大叔的支持!

转载地址:http://clpfm.baihongyu.com/

你可能感兴趣的文章
No toolchains found in the NDK toolchains folder for ABI with prefix
查看>>
Java中可变长参数的使用及注意事项
查看>>
lucene源码分析(4)Similarity相似度算法
查看>>
LESS+to+MCSS
查看>>
ASP.NET CORE 中用单元测试测试控制器
查看>>
2018入门微单相机推荐
查看>>
ORA-00020: maximum number of processes (xxxx) exceeded 报错解决方法
查看>>
Jmeter之csv参数化
查看>>
J2EE程序员应该要掌握的linux知识
查看>>
MySQL中select * for update锁表的范围
查看>>
Python与Microsoft Office自动化操作
查看>>
Linq&C#3.0 Hands on Lab
查看>>
[Nikon D80]高考众生
查看>>
NHibernate 2 学习
查看>>
OWIN and Katana
查看>>
(原創) 如何確保傳進function的array不被任意更改? (C/C++) (C)
查看>>
(原創) 如何讓Quartus II 8.0的Programmer不要另開新視窗? (SOC) (Quartus II)
查看>>
asp.net下使用CKEditor和CKFinder
查看>>
STM32 ADC学习
查看>>
你所不知道的传输层
查看>>