回到目錄html
咱們知道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!mvc
// 摘要: // 表示一個不執行任何操做的結果,如不返回任何內容的控制器操做方法。 public class EmptyResult : ActionResult { // 摘要: // 初始化 System.Web.Mvc.EmptyResult 類的新實例。 public EmptyResult(); // 摘要: // 執行指定的結果上下文。 // // 參數: // context: // 結果上下文。 public override void ExecuteResult(ControllerContext context); }
感受各位對大叔的支持!ide
回到目錄spa