MVC 4中的适当授权重定向AuthorizeAttribute - 隐藏未经授权的菜单选项卡

时间:2013-12-22 19:45:25

标签: asp.net-mvc asp.net-mvc-4 telerik kendo-ui authorization

我非常接近这件事,但仍然缺少一件事。

在常规情况下,当授权失败时,会发生类似这样的事情:

filterContext.Result = new HttpUnauthorizedResult();

这会自动防止未经授权的MVC菜单选项卡呈现(因为每个指向基础授权资源的选项卡都会调用AuthorizeAttribute)。

这可以按预期工作。但是,我想做这样的事情:

protected override void HandleUnauthorizedRequest(AuthorizationContext ctx) {
            ctx.Result = new ViewResult{ ViewName = "Unauthorized"};
            ctx.HttpContext.Response.StatusCode = 401;

这显示了共享的未经授权的视图(同时保留了url原始内容,以便明确未授权的内容)

再次这样做,接受隐藏未经授权的菜单标签的部分。

据我所知,查看source for HttpUnhandledResult它所做的就是将StatusCode设置为401,我在设置分片视图后也会这样做。

但是在我的实现中,未经授权的选项卡仍然显示,但我可以在日志中看到授权失败了。

我正在使用Kendo Menu(telerik)..

1 个答案:

答案 0 :(得分:0)

我最终执行了不同的操作,具体取决于是否为当前路径或菜单项请求了授权。我区分它的方式(在OnAuthorization中)是:

// are we authorizing current path, or a menu tab?????
_authorizingCurrentPath = filterContext.HttpContext.Request.PhysicalPath.Contains(action);

和HandleUnauthorizedRequest:

if (_authorizingCurrentPath)
    ctx.Result = new ViewResult { ViewName = "Unauthorized" };
else
    ctx.Result = new HttpUnauthorizedResult();

这样我就看不到未经授权的菜单项,但如果有人仍然直接去那里,则会在保留原始网址时显示“未经授权”错误。