2011-10-11 19 views
2

我很好奇MVC 3中數據級別安全性的最佳方法。請允許我畫一幅圖片。MVC中的數據級別安全性3

存在事件視圖。此事件列出事件的名稱和玩家在此事件中玩的列表。

根據當前用戶與該事件的關係,每個用戶將得到一個完全不同的視圖。

例如,如果用戶是組織者,則用戶可以查看和管理該事件的所有其他用戶的可用性。

如果用戶僅參與該事件,那麼顯然該用戶只能操縱他自己的可用性。

還有更多的組合。

我知道自定義動作過濾器,但似乎是矯枉過正。

相反,我已經去了一個方法,在事件的索引上,有一個switch語句會重定向到相應的View,例如, OrganiserEventView或PlayerEventView。

這很簡單。我認爲。

亂七八糟的地方在於我使用共享編輯器來枚舉PlayerModels(主視圖模型的一部分)來列出玩家。這個共享編輯器本身也必須尊重數據級別的安全性。

我在正確的軌道上,還是有更好的方法?

+0

嗨,你的問題很有趣,但相當抽象。請給我們幾個詳細的例子嗎? – 2011-10-11 19:28:57

回答

0

Using Roles and custom Role Attributes看起來很不錯(雖然我可以說沒有代碼或者對代碼庫有更好的理解,但沒有人能爲你的問題提供'最好'的方式)。

+0

雖然這不是基於角色的,但它處於數據級別。因此,舉例來說,根據數據,特定用戶可能是事件1的組織者,但僅僅是事件2的玩家 – Duncan

+0

然後,似乎基於事件/其他標準的所有者的自定義動作過濾器是最好的方式去。 –

1

答案將根據應用程序的大小,複雜性和預計增長而變化。雖然在控制器中具有安全性,然後具有不同的視圖工作,但是存在權衡。例如,代碼/標記複製可能是一個退步。對於複雜的應用程序,portlet可能會有所幫助,但這是很重要的。視圖可以基於安全性和訪問角色進行更改,如果通過會話不可用,則可以像控制其他任何一樣傳遞控制器中的參數/數據。我會爲視圖創建一個實用方法,以便邏輯/規則不會在視圖中結束。

+0

我喜歡實用方法的想法,如果不是太麻煩,你能提供一個快速的例子嗎? – Duncan

+0

你的意思是@helper方法嗎? – Duncan

+0

註釋是實現實用程序的一種方法,您可以只使用Util.method(),或者對Spring AOP有一些樂趣。只需一個簡單的地方/電話。 –

1

我看到你的問題的方式,基於角色的安全將是一條路。

如果他們是組織者,那麼他們是組織者的角色。但是你需要抽象一點。由於組織者角色在理論上將是所有其他事件的組織者,因此您需要一種方法來做出決定並根據請求填充角色,因此用戶A是事件A的組織者,但不是事件B的組織者。這理想上需要在訪問控制器代碼之前發生,因此您的選擇是global.asax.cs或auth過濾器。

+0

謝謝,我會調查。對我的簡單解決方案來說,這聽起來有點OTT,但我相信它是一個更復雜系統的非常可擴展的解決方案。 – Duncan

3

Duncan,

這是我在每個應用程序中遇到的情況。以下是一些背景:我在一所大學的一個部門工作,因此我們必須處理多個數據源。我們的大多數應用程序都具有安全性,可以集成大學「中央IT」安全服務,如集中式身份驗證和活動目錄,以及「本土」角色和權限。

我們的應用程序需要根據「本地」應用程序(在本部門內部使用)和企業數據中的數據爲不同用戶提供不同的視圖和操作。

我們的方法: 在四處尋找並找不到任何地方的這個問題的良好解決方案後,我最終編寫了一個安全框架供我們使用。我不妨繼續介紹它在這裏的作用。以下是涉及的內容:

  1. 靜態和動態角色。靜態角色獨立於數據(例如,我在應用程序中獲得開發人員角色),而動態角色依賴於SecurityContext(例如,部門的財務官員在查看其部門帳戶時會獲得'財務官員角色')。
  2. 分配給靜態角色或動態角色的權限。
  3. 一個SecurityContext,封裝了執行權限檢查所需的所有數據,包括當前用戶和任何數據(例如賬號,提案文檔ID,交易日期,任何數據)。
  4. SecurityContextValidator,接受SecurityContext並返回對指定的SecurityContext中指定的User有效的一個或多個Roles。所以這個邏輯決定了誰能看到這個班上的內容。
  5. 每個SecurityContext一個SecurityContextValidator。這個映射是在初始化時用SecurityContextManager註冊的。我使用Ninject加載啓動時執行此操作的安全模塊。
  6. 如果權限未指定SecurityContext(僅包含Asp.Net安全性的Principal信息),則使用默認上下文。
  7. 給定用戶,SecurityContext和權限的SecurityService確定用戶在該SecurityContext中擁有的所有角色,並檢查是否有任何角色檢查了權限。

在這一點上,這裏是在Asp.Net MVC中的示例流程:

  • 接收的HttpRequest
  • 通過窗體身份驗證身份驗證
  • 路由到控制器動作
  • 如果(Permission.GetByName (「CanDoSomething」)。IsAllowed()){//繼續

- 裏面Permission.IsAllowed] -

  • SecurityService接收的SecurityContext
  • 查找SecurityContextValidator指定的SecurityContext
  • 聚集來自SecurityContextValidator
  • 遍歷角色的所有靜態和動態的角色,並檢查其中是否有被許可請求。
  • 返回True或False!

爲了方便起見,我把它一步,創造了一個AbstractContextProtectedAttribute,這需要一個SecurityContextFactory委託,它可以創建一個SecurityContext的(給定的HTTPRequest,例如)和權限檢查與指定的SecurityContext中。這個類的子類可以用來修飾控制器動作。

唷!因此,現在讓我們設置一個用戶,角色,權限表並將它們映射到對方,定義數據庫中的所有權限。我編寫了一個可插入的SecurityPersistenceService,使得安全框架不再需要使用持久性策略 - 我們不幸擁有從DataReaders,DataAdapters到Linq2Sql和EF的所有內容。但至少我們可以這樣寫代碼:

[Protected("CanAccessX")] // Checks using default context 
public class SomeController 
{ 
    [Protected("CanSeeY")] // Checks using default context 
    public PartialViewResult GetY(<parameters>) 
    { 
     var canSeeY_Variation1 = Permission.Get("CanSeeY_Variation1") ; 
     var y_Variation1_Context = new Y_Variation1_Context { <build your context here> } ; 
     if (canSeeY_Variation1.IsAllowed(y_variation1_Context)) 
     { 
      <return variation 1 view> 
     } 

     // Y_Variation_2...etc 
    } 
} 

而要完成這項工作,在啓動時我註冊相應的驗證:

public class MyNinjectModule 
{ 
    public override void Load() 
    { 
     // Wire up a persistence service for the security framework 
     // to use. 
     SecurityService.SecurityPersistenceService = new MySecurityPersistenceServiceImplementation() ; 

     // This is what allows the SecurityService to figure out what Validator to use 
     // in a specified Context to get the User's Roles.   
     SecurityService.RegisterValidator<Y_Variation1_Context>(new Y_Variation1_ContextValidator(...)) ; 
    } 
} 

我現在工作的除了這個框架,讓我們我對數據的枚舉進行這些檢查,從而爲我的所有域對象注入安全基礎結構。我知道這樣做的唯一干淨方式就是使用AOP。我曾經在Java中工作並使用過AspectJ。現在我正在考慮PostSharp。

希望這可以爲您思考問題提供視角。

+0

另外,我建議您查看Kuali Rice框架的身份管理體系結構:http:// www。 kuali.org/rice這是Java,但他們在MVC網絡應用程序中執行數據級別的安全性,所以這裏有一些好的教訓。 –