2011-11-15 81 views
0

我使用SQL Server上的EF Code First繼承了相當大且複雜的ASP.NET MVC3 Web應用程序。它使用ASP.NET成員身份與數據庫身份驗證角色控制器操作通過派生自AuthorizeAttribute的屬性進行保護,該角色將角色映射到操作。有更細的點的擴展方法,例如向特定角色顯示特定的小部件。這很好,我對當前的安全模型有了很好的理解。對現有應用程序應用細粒度安全性

我被要求在數據級別提供更細粒度的安全性。例如,「客戶」用戶只能看到與他們自己相關的數據(在整個數據庫中),而不是其他客戶。問題在於,'客戶'只有5種不同的類型中的1種,並具有各自的特定限制(9種角色中的每一種都是這5種類型中的一種)。

我能想到的最好的事情是遍歷所有的數據存儲庫,並通過每種用戶類型的過濾器來擴展每個LINQ語句/查詢。即使我有時間,它似乎不是最優雅的方式。

有什麼建議嗎?我真的不知道從哪裏開始,所以任何事情都可能有幫助。

非常感謝。

+0

這是一個很好的開始方式,但如果你需要有超級用戶可以看到其他人的數據,這將變得更加複雜。希望所有查詢都是通過某種服務層完成的。那麼在任何複雜程度下都可以很容易地實現安全。不要忘記保護更新。 (用戶A不能修改用戶B的數據。) – Ryan

回答

0

數據驅動的安全性必須在查詢中執行。在項目的後期階段添加這個過程非常耗時。不是由於編程,而是由於測試。如果管理層有這個要求,他們必須簡單地接受。

您可以從重構一些基本查詢開始。每個查詢都必須訪問一些DbSet,以便訪問DbSet訪問權限,而不是訪問某個在該集合上應用安全性的輔助方法。你可以使用DbSet來玩你的派生環境,或者你甚至可以嘗試派生你自己的DbSet,並重新實現IQueryalbe.Expression(明確實現),直接將過濾邏輯添加到集合中。

真正的併發症始於懶惰和渴望加載。 EF不提供過濾懶惰或急切加載的數據的方式。通過精心設計的聚合,您不需要跨客戶延遲加載和熱切加載。如果你需要它,你將不得不重構那部分代碼以使其正常工作(這不僅僅是爲查詢添加一些條件)。

相關問題