我有一个自定义授权标头,在允许用户调用控制器操作之前检查当前用户是否具有某个权限。
[HasPermission(Permission.ViewPage]
public ActionResult Index()
{
return View();
}
HasPermission
类继承自AuthorizeAttribute
并覆盖OnAuthorization
,如下所示:
public override void OnAuthorization(AuthorizationContext context)
{
if (!Permissions.IsUserInPermission(Permission))
{
context.Result = new ViewResult{ ViewName = "Forbidden" };
}
}
除了局部视图之外,几乎所有东西都能很好地工作。
当我将authorization属性放在返回partial的操作上时,将按预期返回Forbidden视图,但它具有完整的布局。完整的布局包含页面上的所有其他元素,如菜单,因此它看起来像iframe到另一个版本的网站。
有没有办法在授权失败时返回部分视图,控制器操作返回部分?
或者我只是以错误的方式做这件事?
将正在返回PartialViewResult的操作标记为[ChildActionOnly],然后可以在过滤器OnAuthorization方法中检查context.Controller.ControllerContext.IsChildAction属性
if (context.Controller.ControllerContext.IsChildAction)
{
context.Result = new PartialViewResult();
}
else
{
context.Result = new ViewResult();
}