2017-08-28 44 views
0

所以我試圖向用戶顯示一條消息,當他從他未被授權查看的頁面重定向時。例如:用戶轉到www.mypage.com/users並重定向到www.mypage.com/home。從AuthorizeCore重定向到另一個具有自定義錯誤消息的控制器

我使用MVC模式,它是asp.net web應用程序。 我重寫AuthorizeAttribute和AuthorizeCore方法嘗試這樣的:

protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 


      if (false)//Here is custom logic that is working 
      { 
       string message = "You don't have an access to selected menu item."; 
       var dataDict = HttpContext.Current.Session["__ControllerTempData"] as IDictionary<string, object>; 
       if (dataDict == null) 
       { 
        Dictionary<string, object> dictionary = new Dictionary<string, object>(); 
        dictionary["myErrorMessage"] = message; 
        HttpContext.Current.Session["__ControllerTempData"] = dictionary; 
       } 
       else 
       { 
        dataDict["myErrorMessage"] = message; 
        HttpContext.Current.Session["__ControllerTempData"] = dataDict; 
       } 

       _isAuthorized = false; 

       httpContext.Response.Redirect("Home");     
      } 
      else 
      { 
       _isAuthorized = base.AuthorizeCore(httpContext); 
      } 

      return _isAuthorized; 
     } 

然後我試圖從該視圖訪問它

var unauthorized_access_message = TempData["myErrorMessage"] as List <string> ?? new List<string>() ; 

但它不工作。我也試過this,但不是這樣,因爲我試圖訪問一個控制器,然後重定向到另一個。 是否有任何解決方案將變量傳遞給視圖或檢查某些狀態(如重定向原因)?

回答

0

我通過使用Cookie來解決它。

在CustomAuthorizeAttribute設置的cookie:AuthorizeAttribute類:

protected override bool AuthorizeCore(HttpContextBase httpContext) 
      { 

       if (false) 
       { 
        HttpCookie mycookie= new HttpCookie("unauthorize_error", "You do not have access to requested link."); 
        httpContext.Response.SetCookie(mycookie); 
        httpContext.Response.Redirect("Home"); 
        return false; 
       } 
       else 
       { 
        return base.AuthorizeCore(httpContext); 
       } 
      } 

然後在控制器:

string cookieValue = string.Empty; 
      if (Request.Cookies["myCookieName"] != null 
       && !string.IsNullOrEmpty(Request.Cookies["myCookieName"].Value)) 
      { 
       cookieValue = Request.Cookies["myCookieName"].Value; 
       var myCookie = new System.Web.HttpCookie("myCookieName"); 
       myCookie.Expires = System.DateTime.Now.AddDays(-1d); 
       Response.Cookies.Add("myCookieName"); 
      } 
var messages = TempData["mytemperror"] as List<string> ?? new List<string>(); 
      messages.Add(message); 
      TempData["myTempError"] = messages; 
鑑於

最後:

var errorMessage = TempData["myTempError"] as List<string> ?? new List<string>(); 
0

而不是AuthorizeCore,你可以覆蓋OnAuthorization其中您可以直接從Controller訪問TempData

public override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    if (false) 
    { 
     filterContext.Controller.TempData["myErrorMessage"] = 
      "You don't have an access to selected menu item."; 
    } 
    base.OnAuthorization(filterContext); 
} 

使用

string unauthorized_access_message = (TempData["myErrorMessage"] ?? "").ToString(); 
+0

很抱歉,但不起作用。我認爲這是因爲重定向。比方說,有人試圖訪問帳戶控制器,但沒有權限(它會打OnAuthorization並設置tempdata),所以他將被重定向到主控制器(它會再次打到OnAuthorization,但之後就沒有那個TempData了)。至少當我嘗試從Home/Index訪問它時,它是空字符串。 – maximelian1986

+0

通常情況下,匿名用戶應該被重定向到「登錄頁面」而不是「主頁」,除非主頁都是匿名訪問。 – Win

+0

問題是它不是匿名用戶。我有自定義身份驗證。因此,用戶通過身份驗證但未獲得授權,可以說管理員可以訪問帳戶/成員,他可以在其中獲得成員名單。但是,如果會員嘗試訪問它,他必須轉到主頁/索引並看到「沒有權限」通知。 – maximelian1986

相關問題