部分视图和视图的授权重定向

Posted

技术标签:

【中文标题】部分视图和视图的授权重定向【英文标题】:Authorization Redirect for Partial Views and Views 【发布时间】:2017-12-20 16:07:39 【问题描述】:

我有一个自定义授权标头,在允许用户调用控制器操作之前检查当前用户是否具有特定权限。

[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" ;
        
    

这对几乎所有东西都很有效,除了部分视图

当我将授权属性放在返回部分的操作上时,会返回 Forbidden 视图,正如预期的那样,但它具有完整的布局。完整的布局包含页面上的所有其他元素,例如菜单,因此它看起来像是进入另一个版本的网站的 iframe。

有没有办法在返回部分视图的控制器操作上授权失败时返回部分视图?

还是我这样做的方式不对?

【问题讨论】:

您是否尝试过检查 context.Controller.ControllerContext.IsChildAction 并返回一个 PartialViewResult 如果它是真的? @Fran 不,我没有。这听起来正是我需要的。控制器如何确定 Child Action 是什么? 动作需要带有 [ChildActionOnly] 属性的注释。 @Fran 想提出解决方案?那行得通。 【参考方案1】:

将返回 PartialViewResult 的操作标记为 [ChildActionOnly],然后您可以在过滤器 OnAuthorization 方法中检查 context.Controller.ControllerContext.IsChildAction 属性

        if (context.Controller.ControllerContext.IsChildAction)
        
            context.Result = new PartialViewResult();
        
        else
        
            context.Result = new ViewResult();
        

【讨论】:

以上是关于部分视图和视图的授权重定向的主要内容,如果未能解决你的问题,请参考以下文章

会话到期时的授权重定向不适用于提交 JSF 表单,页面保持不变

集合视图单元格重定向不同的 ViewController

尝试从部分视图重定向用户时出现CORS错误

Linkedin OAuth 2.0 重定向 URL 不能包含片段标识符 (#)

重定向不同的视图脚本

在哪里输入 Facebook 登录授权重定向 URI?