2013-12-22 29 views
0

我非常接近讓這件事情正確,但仍然缺少一件事。在MVC中正確授權重定向4 AuthorizeAttribute - 隱藏未授權的菜單標籤

在常規情況下

,當授權失敗,這樣的事情發生了:

filterContext.Result = new HttpUnauthorizedResult(); 

這個自動的防止未經授權的MVC菜單選項卡從渲染(因爲AuthorizeAttribute被每一個指向授權資源基本選項卡)。

這個按預期工作。不過,我想這樣做:

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

這說明共享未經授權的視圖(同時保持原來的網址,以便其明確什麼是未經授權的)

再次這部作品,接受部分隱藏未授權的菜單選項卡。

據我可以告訴看看source for HttpUnhandledResult它所做的全部工作是將StatusCode設置爲401,我也將設置我的分片視圖作爲結果後進行。

我的執行

然而,未授權的標籤仍然顯示,但我可以在授權他們失敗日誌中看到..

我使用的劍道菜單(Telerik的)..

回答

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(); 

這樣,我沒有看到未經授權的菜單項,但如果有人還是直接去那裏,顯示「未經授權」錯誤,同時保留原始網址。