回到目录

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

看下面代码

  1. public override void OnAuthorization(AuthorizationContext filterContext)
  2. {
  3. #region 例外
  4. bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true) ||
  5. filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true) ||
  6. filterContext.RequestContext.HttpContext.Request.Url.Host == "localhost";
  7.  
  8. if (skipAuthorization)
  9. return;
  10. #endregion
  11.  
  12. //当前为正常页面,不是分布视图
  13. var isValid = false;
  14. //当前用户的菜单和权限
  15. var menuAuthority = Lind.DDD.Utils.SerializeMemoryHelper.DeserializeFromJson<List<Tuple<int, string, int>>>(CurrentUser.ExtInfo);
  16. //当前控制器对应的权限值
  17. var controllerName = filterContext.RouteData.Values["controller"].ToString();
  18. var actionName = filterContext.RouteData.Values["action"].ToString();
  19. //当前权限,先找完全匹配的,如果没有,再找controller匹配的
  20. var current = menuAuthority.Find(i => !string.IsNullOrWhiteSpace(i.Item2)
  21. && i.Item2.ToLower() == ("/" + controllerName + "/" + actionName).ToLower());
  22.  
  23. if (current != null)
  24. {
  25. if ((current.Item3 & (int)Authority) == (int)Authority)
  26. {
  27. isValid = true;
  28. }
  29. }
  30.  
  31. if (!isValid)
  32. {
  33.  
  34. string returnUrl = filterContext.RequestContext.HttpContext.Request.UrlReferrer == null ? "/AdminCommon/LogOn" : filterContext.RequestContext.HttpContext.Request.UrlReferrer.AbsolutePath;
  35. filterContext.RequestContext.HttpContext.Response.Write("<div style='text-align:center'><div style='MARGIN-RIGHT: auto;MARGIN-LEFT: auto;width: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>");
  36. filterContext.RequestContext.HttpContext.Response.End();
  37. filterContext.Result = new EmptyResult();//清空当前Action,不执行当前Action代码
  38.  
  39. }
  40. }

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

  1.   // 摘要:
  2. // 表示一个不执行任何操作的结果,如不返回任何内容的控制器操作方法。
  3. public class EmptyResult : ActionResult
  4. {
  5. // 摘要:
  6. // 初始化 System.Web.Mvc.EmptyResult 类的新实例。
  7. public EmptyResult();
  8.  
  9. // 摘要:
  10. // 执行指定的结果上下文。
  11. //
  12. // 参数:
  13. // context:
  14. // 结果上下文。
  15. public override void ExecuteResult(ControllerContext context);
  16. }

感觉各位对大叔的支持!

回到目录

爱上MVC~AuthorizeAttribute验证不通过如何停止当前上下文的更多相关文章

  1. 【MVC】ASP.NET MVC Forms验证机制

    http://www.cnblogs.com/bomo/p/3309766.html 随笔 - 121  文章 - 0  评论 - 92 [MVC]ASP.NET MVC Forms验证机制 ASP. ...

  2. NET MVC权限验证

    ASP.NET MVC权限验证 封装类 写该权限类主要目地 为了让权限配置更加的灵活,可以根据SQL.json.或者XML的方式来动态进行页面的访问控制,以及没有权限的相关跳转. 使用步骤 1.要建一 ...

  3. MVC AuthorizeAttribute 动态授权

    开发中经常会遇到权限功能的设计,而在MVC 下我们便可以使用重写 AuthorizeAttribute 类来实现自定义的权限认证 首先我们的了解 AuthorizeAttribute 下面3个主要的方 ...

  4. .net web mvc 权限验证

    这里分享MVC的权限验证,内容中可能存在一些,莫名其妙的方法,那些是以前封装好的,大致可以根据方法名称知道他的意思. using Game.Entity; using Game.Entity.Plat ...

  5. ASP.NET MVC Model验证(五)

    ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...

  6. ASP.NET MVC Model验证(四)

    ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而Mod ...

  7. ASP.NET MVC Model验证(三)

    ASP.NET MVC Model验证(三) 前言 上篇中说到在MVC框架中默认的Model验证是在哪里验证的,还讲到DefaultModelBinder类型的内部执行的示意图,让大家可以看到默认的M ...

  8. ASP.NET MVC Model验证(二)

    ASP.NET MVC Model验证(二) 前言 上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决这个问题的,并且会描述一下 ...

  9. ASP.NET MVC Model验证(一)

    ASP.NET MVC Model验证(一) 前言 前面对于Model绑定部分作了大概的介绍,从这章开始就进入Model验证部分了,这个实际上是一个系列的Model的绑定往往都是伴随着验证的.也会在后 ...

随机推荐

  1. C# 微信v3退款

    1.退款需要退款证书.C#都是用p12的证书,双击证书导入,密码是mch_id(商户号) 2.调用微信退款接口进行退款操作 string resp=string.Empty string cert = ...

  2. ORACLE导入、导出命令使用方法

    oracle导入.导出命令使用方法: 给用户增加导入数据权限的操作 第一,启动sql*puls 第二,以system/manager登陆 第三,create user 用户名 IDENTIFIED B ...

  3. 【随机化】bzoj4080 [Wf2014]Sensor Network

    #include<cstdio> #include<algorithm> #include<cmath> using namespace std; typedef ...

  4. 轻量级ORM框架 Dapper快速学习

    好在有师兄师姐一起带着做,所以开始没那么困难,但是由于大学涉猎范围有限,往往有很尴尬的时候,不懂构造方法重载,去“请教”,本来以为师兄会帮忙写好,结果“我念,你来写”,被深深的激励了一把,后来就早出晚 ...

  5. [SystemC] Setting Up the Environment

    My operating system is Ubuntu 12.04. 0. Checking Your Compilers First thing first, you will need the ...

  6. JS动态级联菜单

    JS动态级联菜单是前端常用的一个功能,特此抽时间研究了下,附上代码 <html> <head> <meta charset="utf-8" /> ...

  7. MOTION-MATCHING IN UBISOFT’S FOR HONOR翻译

    http://www.gameanim.com/2016/05/03/motion-matching-ubisofts-honor/ Introducing For Honor with a vide ...

  8. css中关于position属性的探究(原创)

    关于position属性的设置,头脑中一直觉得不是很清楚,所以借助这次机会单独自己测试了一下,记作学习笔记.   首先,css的position属性包含下面四种设置情况: static:默认属性.指定 ...

  9. VIM使用(三)

    Vim自动补全神器:YouCompleteMe Ubuntu下,先通过Bundle安装插件: Bundle 'Valloric/YouCompleteMe'Bundle 'scrooloose/syn ...

  10. C/C++头文件一览

    C.传统 C++ #include <assert.h> //设定插入点 #include <ctype.h> //字符处理 #include <errno.h> ...