2014-05-22 230 views
0

我正在使用基於角色的授權,並且當他們沒有正確的角色時,我已經讓這個類處理重定向到自定義視圖。MVC 5 - 角色授權 - 自定義未授權頁面

public class MyAuthorizeAttribute : AuthorizeAttribute 
    { 
     protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
     { 
      if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
      { 
       base.HandleUnauthorizedRequest(filterContext); 
      } 
      else if (!this.Roles.Split(',').Any(filterContext.HttpContext.User.IsInRole)) 
      { 

       filterContext.Result = new ViewResult 
       { 
        ViewName = "~/Views/Shared/_Unauthorized.cshtml" 
       }; 
      } 
      else 
      { 
       base.HandleUnauthorizedRequest(filterContext); 
      } 
     } 
    } 

而我只是把它添加到這樣每個控制器動作:

[MyAuthorize(Roles = "Admin")] 

這工作得很好,但我希望得到我的未經授權的網頁上一些更多的信息。 所以問題是我如何傳遞信息,如他們試圖訪問哪個頁面,需要什麼角色以及他們已擁有哪些角色。 我該在哪裏做?在MyAuthorizeAttribute類中?我如何將信息傳遞給視圖?

回答

0

你好你可以使用System.Web.Mvc.HandleErrorInfo

所有信息

嘗試這種觀點爲Unauthorized.cshtml:

@model System.Web.Mvc.HandleErrorInfo 


<!DOCTYPE html> 
<html> 
<head> 
    <title>Error</title> 
</head> 
<body> 
    <h2> 
     <br /><br /> Sorry, an error occurred while processing your request.<br /> 

     <u> <b>Identity :</b></u> @User.Identity.Name<br /> 
     <u> <b> Error Description : </b></u><br/> 
     @Model.Exception.Message<br /><br /><br /> 


     You can refer this page to Administrator 

     @Model.Exception.StackTrace 
    </h2> 
</body> 
</html> 
+0

這並不真正起作用,因爲當我來到此頁面時我沒有得到異常。所以堆棧跟蹤和消息是空的。這不是我正在尋找的信息。我正在尋找一種方法來獲得所要求的角色。可以從MyAuthorizeAttribute類中使用「this.Roles」行讀取,但我必須以某種方式將該角色發送到視圖。並循環顯示當前用戶的角色並顯示它們 – stibay

+0

是的,這只是例外。 –

0

你可以建立某種形式的視圖模型,並在傳遞任何數據,如這樣

filterContext.Result = new ViewResult 
{ 
    ViewName = "~/Views/Shared/_Unauthorized.cshtml" 
    ViewData = new ViewDataDictionary { Model = new MyViewModel() { Role= "xxx"} } 
}; 

或者

filterContext.Controller.ViewData.Model = new MyViewModel() { Role= "xxx" }; 
filterContext.Result = new ViewResult 
{ 
     ViewName = "~/Views/Shared/_Unauthorized.cshtml" 
     ViewData = filterContext.Controller.ViewData 
}; 

然後根據正常情況在您的視圖中訪問該模型