2011-02-26 78 views
10

我一直在想通過這個答案,並找不到一個好的解決方案,如何正確地做到這一點。
如何擴展/架構ASP.NET MVC 3授權屬性來處理這種情況

我已經讀了這些文章
http://schotime.net/blog/index.php/2009/02/17/custom-authorization-with-aspnet-mvc/
http://geekswithblogs.net/brians/archive/2010/07/08/implementing-a-custom-asp.net-mvc-authorization-filter.aspx
ASP.NET MVC custom authorization
http://davidhayden.com/blog/dave/archive/2009/04/09/CustomAuthorizationASPNETMVCFrameworkAuthorizeAttribute.aspx
Custom Authorize Attribute additional Param?

思想也許是最後一個接近。


場景:

  • 用戶創建角色
  • 用戶可以指定哪些角色可以訪問做。
  • 用戶將用戶添加到這些角色
  • 用戶也是部門的一部分。

所以在控制我怎麼能說一個用戶訪問一個動作,因爲我不知道什麼是用戶的管理員創建的角色?

因此,在邏輯...讓我們說我有一個任務控制器與「創建」,「細節」。該任務有一個「服裝」部門。

  • 任務:
    - 的TaskID
    - TaskTitle
    - TaskDepartmentID

  • - 用戶:
    - 用戶名
    - 角色
    - 部門

    我會以某種方式關聯「創建創建任務「用行動‘查看任務詳情細節‘行動‘’能力
    我將在以某種方式聯繫起來’,’能力

管理員將添加一個名爲新角色‘任務的用戶’,並說這個角色可以「創建任務」
管理員也將使這個角色「查看任務詳情」
管理員將打開「部門級安全」


創建:
當在控制器上調用任務創建時,我需要確保用戶處於允許「創建任務」的角色中。所以默認情況下,我不能發送允許進入授權屬性的「角色」,因爲我不知道它們。我莫名其妙地需要在所有的用戶角色來發送和查看某個角色先後獲得「創建任務」

與安全部查看:
當另一個用戶去查看這個任務,他們可以訪問到「查看任務細節」(我可以弄清楚,但我解決了第一個問題)。但是,由於該任務是針對另一個部門,而不是他們所在的部門,所以我需要拒絕訪問。如果任務是用戶所在部門之一的一部分,用戶只能「查看任務詳細信息」。

這是我無法弄清楚的。如何正確擴展AuthorizeAttribute,這樣我就可以通過GerRolesForUser發送一個角色列表,因爲它只接受一個字符串,以及如何識別它的作用,然後通過檢查Department ID來限制另一個級別的安全性。

部門ID不一定要緩存,所以也許我可以在控制器級別做到這一點。

+0

我有類似的情況,你說的授權是數據庫驅動。你有沒有想出實現這個目標的好方法? – Zacho 2011-04-06 14:55:44

回答

1

我有點類似的問題,我沒有使用授權屬性。

取而代之,我決定擴展Controller類並覆蓋OnActionExecuting的實現。在我的實施中,我可以執行所有檢查,例如哪個部門用戶屬於他,以及他是否足夠查看其他部門的數據。看看這種方法是否適合你。

+2

只是添加我發現這篇文章在SO http://stackoverflow.com/questions/1335315/access-control-in-asp-net-mvc-depending-on-input-parameters-service-layer/1336404#1336404哪可以給你更多的提示。 – Pradeep 2011-02-26 03:05:36

+1

不確定我是否同意這篇文章基於此方法。 (http://blogs.teamb.com/craigstuntz/2009/09/09/38390/)由於緩存。部門可能需要在控制器中進行擴展檢查。這很好。但是,這不適用於主要功能。 – Mastro 2011-03-02 04:52:49

+0

Pradeep,這可能是我看到的東西。基於ACL的安全性。感謝您的發現。 – Mastro 2011-03-02 05:00:09

1

我有點類似的問題,我沒有使用授權屬性。

相反,我決定採取不同用戶的-2佈局。

如果用戶是管理員,那麼他將轉到不同的視圖,如果用戶是客人,他將通過不同的佈局轉到不同的視圖。