MVC 5 - 角色授权 - 自定义未授权页面

时间:2014-05-22 07:54:28

标签: asp.net-mvc asp.net-mvc-4 authorization

我正在使用基于角色的授权,并且我已经使这个类在没有合适角色时处理重定向到自定义视图。

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类中?我如何将信息传递给视图?

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

你可以创建某种viewmodel并传递任何数据,如

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
};

然后按照正常情况在视图中访问该模型