2011-12-05 84 views
4

我有一個包含一些標籤,並選擇一個的時候,它的內容是通過一個AJAX調用服務器檢索頁面的網站。每個選項卡都通過不同的控制器加載。例如,我有一個包含產品和客戶端選項卡的客戶頁面。限制訪問控制方法在ASP.NET MVC 3

該網站擁有不同類型的用戶,具有不同的權限級別。

我想要做的就是保護控制器,並且只有當登錄用戶有權限時才顯示選項卡的內容。所以如果沒有權限的用戶輸入控制器的url,它應該重定向到登錄頁面。 url是這樣的:

http://localhost/MyApp/Products/1 

其中1是產品的數據庫ID。

我可以實現這2個解決方案,但他們都不是最優的:

  1. 使用ChildOnlyAction屬性。我將使用此屬性標記產品控制器的操作,並使用RenderAction呈現主視圖中的選項卡。但這意味着頁面上的所有選項卡都必須呈現,這並不是最佳選擇,因爲我只想在用戶單擊選項卡時加載數據。

  2. 在每次請求的產品控制,我會使用記錄的ID,以檢查用戶是否有權訪問它使數據庫查詢。但是這意味着對於每個請求我都需要運行額外的查詢。

我想知道是否有更好的方法來做到這一點。

回答

4

與Romias建議的類似。您可以將Authorize元屬性與定製的IAuthorizationFilter過濾器結合使用。

當你實現你指定的用戶或角色應有權採取行動的列表授權元屬性。這缺乏使用數據庫來指定用戶應該訪問哪個ID的能力。

正是這個ID到用戶映射,其中的個IAuthorizationFilter也發揮了作用。在過濾器中,您可以根據數據庫檢查當前用戶。

樣品個IAuthorizationFilter和它的使用可以在以下網頁上找到:

http://geekswithblogs.net/brians/archive/2010/07/08/implementing-a-custom-asp.net-mvc-authorization-filter.aspx

+0

+1 – Romias

3

您是否嘗試過使用授權過濾器來裝飾您要保護的控制器?

[Authorize(Roles = "UserType1")] 

您也可以擴展授權篩選器以添加自己的邏輯。 在這裏您可以看到擴展授權過濾器的示例:https://stackoverflow.com/a/428266/7720

+0

如果沒有自訂個IAuthorizationFilter,設置角色,甚至用戶將無法正常工作。爲了過濾基於你既需要授權屬性以及自定義個IAuthorizationFilter的ID。示例鏈接爲 –