爱上MVC~AuthorizeAttribute验证不通过如何停止当前上下文
2016-09-24 17:28
323 查看
回到目录
我们知道mvc里有一些过滤器,AuthorizeAttribute用来做授权,一般在用户授权方面可以使用它,当使用没有登陆,我们直接跳到登陆页,这是没有问题的,可我要说的是,当用户对某个Action没有权限时,如何禁止对当前action的执行,这个听起来很不可思议,因为我们一般感觉,当AuthorizeAttribute验证不通过后,它的当前action也不会被执行,可事实并非如此!
上面代码是大叔在进行权限设计时用到的,请注意最后一句EmptyResult,这个方法表示返回一个空的Actioin的结果,只有加上这个空结果,你的当前Action才不会被执行,大叔觉得,这是一种架构设计的新思想,像没多架构都使用了这种空对象的技术,空对象即什么事件都不做,但它并不是null!
感觉各位对大叔的支持!
回到目录
我们知道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;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>"); 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); }
感觉各位对大叔的支持!
回到目录
相关文章推荐
- 在MVC中如何在使用 MicrosoftMvcValidation验证的前提下使用 jQuery.Ajax 提交数据的时候检查验证是否通过
- SharePoint基于windows验证的如何通过组策略实现IE自动以当前域账号登录SP站点
- (论坛答疑点滴)如何向某网址Post信息,并得到CookieContainer以便以后直接通过验证
- 如何通过资源管理器取得当前的路径、焦点文件 msdn
- 如何通过T-SQL获得当前连接的客户端的IP和机器名
- 如何在ASP.NET中使用验证通过的Windows Live ID用户登录网站
- 盗版windows如何通过验证安装 Media Player 11
- 如何通过 SQL Server 2000 使用 Forms 身份验证
- 如何通过AppDomain用特定的安全上下文加载外部程序集
- 如何让Office 2003通过正版验证
- 如何通过AppDomain用特定的安全上下文加载外部程序集
- 如何通过批处理将子文件夹内的文件移动到当前文件夹
- 如何通过 SQL Server 2000 使用 Forms 身份验证
- 如何通过T-SQL获得当前连接的客户端的IP和机器名...
- 如何通过需要验证的邮件服务器发送邮件?
- 如何使mediaplayer 11通过验证
- 如何向某网址Post信息,并得到CookieContainer以便以后直接通过验证(续)
- 如何向某网址Post信息,并得到CookieContainer以便以后直接通过验证
- 如何通过需要验证的邮件服务器发送邮件?
- 网站如何达到W3C标准?网页如何通过W3C验证?