2014-05-22 180 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 
}; 

然后根据正常情况在您的视图中访问该模型