2010-07-29 35 views
0

背景:MVC2完全新增。有C#經驗,但有限的網絡體驗。關於細粒度授權和MVC2的問題

我需要更多細粒度的訪問權限,而不僅僅是將角色分配給用戶。用戶可能在樹中的0+點處具有角色。

/ 
    /Europe 
    /England 
    /France 
    /USA 

例如,用戶可能是「歐洲」下所有論壇的主持人,並且可以在法國發布新聞。

兩個例子控制器有行動,因爲這些:

ForumController:

public ActionResult DeletePost(int id) { ... } 

NewsController:

[HttpPost] 
public ActionResult Post(int treeID, ...) { ... } 

我應該怎樣處理這個?從我收集的Membership + RoleProvider無法做到這一級別的細粒度控制。 以前我寫過自定義的用戶/角色/授權系統,它支持所有這些,但它與「標準」控件(如LoginView)不兼容。

的目標將是具有允許像這樣的訪問角色:

NewsAdmin

  • 添加新聞

  • 編輯新聞

  • 刪除新聞

NewsPoster

  • 添加新聞

因此,新聞CONTROLER的行動後應檢查:是否有用戶「添加新聞」 - 訪問,他試圖張貼?

我真的很想用某種方式指定這個屬性,所以實際的操作代碼可能更乾淨,只是假設調用者具有適當的訪問權限。

希望這個問題是有道理的,我可以得到一些關於在哪裏閱讀的指針。 (哦,我相信這個問題已經在某些變體中得到了回答,我似乎無法找到它,如果您覺得這些答案可能對您有幫助,我不介意單鏈接回復。閱讀)

回答

0

我認爲你太快了解僱角色提供者。如果一個用戶有一個叫做NewsAdmin_Europe_AddNews的角色,這個角色幾乎可以回答這個問題,不是嗎?

一旦你使你的認證方案與角色提供者一起工作,你需要將它綁定到MVC中。子類型AuthorizeAttribute並覆蓋AuthorizeCore警告:您的代碼必須是線程安全的並且可重入。調用base.AuthorizeCore,然後根據URI /查詢測試特定角色(因爲這可以從緩存中提供,繞過MVC,所以不會獲取路由值)。

這是一些工作,但最終會比嘗試重新創建成員身份更安全。

+0

我考慮使用類似於NewsAdmin_Europe_AddNews的東西,但這會阻止我輕鬆添加對NewsAdmin角色的「DeleteComments」訪問權限。我需要創建NewsAdmin_%s_DeleteComments。 – Thomas 2010-07-29 14:52:36

+0

他們是不同的角色。每個權限使用一個角色。角色提供者是圍繞這個想法構建的。澄清:對你來說,「NewsAdmin」是一個角色。這很好,但它與「NewsAdmin_Europe_DeleteComments」不同,它對提供商很重要。提供者的角色概念既包括你認爲的角色,也包括你認爲的「權限」。 – 2010-07-29 15:32:51

+0

你完全正確。對我而言,NewsAdmin是角色,「添加,編輯等」是構成該角色的單獨權限。 從概念上講,角色提供者概念似乎是不可修復的,不可維護的。 (雖然我希望是錯的)。 在真實世界的應用程序中,如何爲具有「NewsAdmin_Europe_ *」角色的所有用戶添加「NewsAdmin_Europe_DeleteComments」角色? 另一個問題是,它會混亂一個用戶界面,使每個葉子在歐洲的4個角色,而不是隻有在X,Y和Z的「NewsAdmin」。 感謝您的時間。我將閱讀一些 – Thomas 2010-07-29 17:59:55