2015-09-09 159 views
1

我已經做了一些搜索,但它看起來不像是一個非常常見的問題或回答的問題。我需要在我正在開發的MVC應用程序中實現自定義組授權策略。排序它遵循「經典」例如:MVC自定義組授權

用戶可以創建一個組。一個組在數據庫中作爲一個對象存在,其中包含一個Id,Name以及屬於這個組的用戶列表。

角色

用戶可以持有許多團體的作用。例如,該組的創建者立即成爲該組的管理員。不同的角色可以訪問組內的不同事物。

我知道用預定義的組很容易,但是當我想讓組動態化並且每個組成爲數據庫中的對象時,怎麼辦?

這個在真實世界中的一個簡單例子就是facebook上的羣組,其中包含管理員,版主,內容創建者等。只有成員可以看到它們,編輯它們或張貼給他們。

任何想法?

+0

究竟是什麼問題? – user1666620

回答

1

這是一個非常主觀的設計問題,可能沒有單一的「正確」答案。

我傾向於將aspnet角色用於應用程序級角色,例如系統管理員和普通用戶,並且與應用程序級權限有關 - 可以嚮應用程序添加新用戶,刪除記錄的能力,編輯能力記錄等

這聽起來對我來說更像是這樣的事情,你希望用戶能夠自己做,而無需疏忽。

創建一個組表,並與Users表有多對多的關係,該表定義了用戶所屬的組。

如果您只需要每個組1個管理員,則可以使組表具有AdminUserId列。否則,有一個多對多的關係表,GroupAdmins(我會去這個選項,因爲它允許可擴展性)。

+0

是的,我儘可能讓團隊和角色將保持不變(管理員,主持人,成員),但我想知道是否有什麼我可以重寫/實現,將使「如果(!IsAMember( (Group = id,Role = admin)]屬性 – AllFallD0wn

+0

@ AllFallD0wn,所以你真正的問題是如何將一個屬性添加到actionmethod中,該屬性檢查用戶是否與記錄相關聯? – user1666620

+0

這是「什麼是最好的/最乾淨的方式來實現這個?」我假設一個屬性可能是最乾淨的方式,因爲它避免了大量的隨機調用,並返回方法頂部的方法 – AllFallD0wn

1

你可以繼承AuthorizeAttribute來創建你喜歡的任何安全方案。但是既然你說這不是授權,我不確定這是否是正確的方法。

AuthorizeAttribute確實2個不同的東西:

  1. 檢查是否當前用戶可以訪問當前控制器/動作。
  2. 執行處理程序以在未經授權時執行操作。

這些東西都可以通過繼承AuthorizeAttribute進行定製。從您的問題中不清楚如果用戶不屬於某個組或角色應採取的行動。

在任何情況下,橫切關注的最佳選擇(看起來是)執行IActionFilterIAuthorizationFilter(由AuthorizeAttribute執行)。

注:微軟沒有實現這個功能非常好(或者至少他們傾向於在他們的營銷,這是具有行爲屬性ActionFilterAttribute)對於我們這些使用依賴注入。如果您碰巧在應用程序中使用DI,請參閱passive attributes以獲得最佳選擇。看幾個例子herehere