我正在使用基于角色的授权,并且我已经使这个类在没有合适角色时处理重定向到自定义视图。
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 :(得分: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
};
然后按照正常情况在视图中访问该模型