我非常接近这件事,但仍然缺少一件事。
在常规情况下,当授权失败时,会发生类似这样的事情:
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)..
答案 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();
这样我就看不到未经授权的菜单项,但如果有人仍然直接去那里,则会在保留原始网址时显示“未经授权”错误。