2011-02-04 34 views
2

我有一個稍有不同尋常的安全要求,我正在尋求有關最佳實踐或至少非脆弱方法的建議。ASp.NET MVC EF4 SQL表或字段級安全

場景:內聯網系統。關於一些相關實體的數據將被視爲私有。這被稱爲系統的未發佈部分。只有特定的用戶可以訪問這些數據。在某個階段,用戶從這些數據中進行選擇,標記一些記錄並將其發佈到「已發佈」一側。發佈到已發佈側的數據將從未發佈側移除。然後大部分系統用戶可以在已發佈方的記錄上工作。

我知道這聽起來像是父母記錄上的bool字段,標記爲已發佈或未發佈,但讓我解釋我們正在替換的系統是如何解決問題的 - 這是我們需要模擬的安全級別。它是一個平面文件數據庫(Dataflex),將未發佈和發佈的數據放在單獨的表中,位於單獨的服務器驅動器上,備份到單獨的磁帶,在不同的房間中,由不同的人進行物理訪問。網絡權限確保發佈的用戶無法查看未發佈的數據。該軟件還管理權限,但如果出錯或程序員犯了錯誤,他們仍然無法訪問錯誤的數據。可能會提供這些數據的系統管理員有正面的安全審批。

所以我正在尋找的是如何實現與MVC,EF4,SQL實現這一點的體系結構的建議。在一個極端情況下,我構建了兩個帶有兩個sql數據庫的系統,具有不同的權限:可能包含web.config中包含的差異,因此它實際上是相同的代碼庫。在比例的另一端,它的表格中的控制器方法標記爲拒絕訪問。 (這是不好的,因爲如果一個程序員搞砸了,說一個搜索查詢,它返回的數據來自錯誤的類別,並且讓它不被人注意到,它很可能導致人類的犧牲,狗和貓一起生活......質量歇斯底里)

對不起,冗長的描述。最佳做法或其他建議如何訪問此尋求。

+0

出於好奇,什麼行業都在你的工作? :) – RPM1984 2011-02-04 09:56:30

+0

它與皇室相關。 – Andiih 2011-02-04 10:01:36

回答

2

不是一個MVC/EF-明確的答案,但有,回答了很多問題,可能是有用的舊的Technet紙(用於SQL Server 2005):

「實施行級別和單元級安全性使用SQL Server 2005分類數據庫「

Available on Technet。同一篇論文也可以是downloaded as a Word document

1

老實說,我不相信EntityFramework是你正在尋找的ORM。你需要更多的控制,而不是它提供的東西 - 我想到的事情是能夠在連接上設置審計信息,以便知道用戶是誰,可以運行登錄觸發器,然後也許你想擁有截取關係的代碼和實體並執行代碼安全。如果你是熱衷於使用ORM,然後prehaps閱讀:

Nhibernate vs EntityFramework in the real world

如果信息是極其重要的或祕密就像你說的,數據庫的安全性將不得不執行,但不能足以應用程序級別的安全性(認爲縱深防禦)。

假設你正在部署一個web服務器和一個應用程序服務器,並將它們與wcf連接起來,所以問題不應該是MVC將要做什麼,而是如何選擇MVC,WCF和ORM(如果有的話)將要互動。

另一種方式,prehaps,是在sql server中使用可更新的視圖來屏蔽未發佈的數據。

+0

有趣的閱讀。我會進一步鑽研Nhibernate。我可能能夠通過以下方式來推動這一變化:您將滿足審計需求,登錄觸發器等。可更新的視圖可能會有所幫助,但仍不能提供與用戶綁定的表級安全性。它不是一個分層的部署,沒有WCF,雖然也許它應該是!我不打算進入「我們如何到達我們的位置」,但已經有很多系統已經到位。 – Andiih 2011-02-04 10:13:02

1

如果您的所有實體爲其核心身份字段共享一個公共基類,則不會那麼困難。只要您的實體共享一個公共基類,您就可以爲該基礎創建一個擴展方法,該方法使用實體的鍵和嘗試操作的用戶的給定ID,並且您可以驗證它是否在你的數據訪問層。

public static bool ActionIsAuthorized<T>(this T entity, ActionType actionType, string  actionBy) where T : BaseEntity 
{ 
    bool authorized = false; 
    //do your auth lookup here based on which kind of action they are performing. ActionTypes  is an enum 
    return authorized; 
} 

然後就是這樣稱呼它:

if(!YourEntity.ActionIsAuthorized(ActionType.Update, username)) 
{ 
    throw new ActionUnauthorizedException(); 
} 
else 
{ 
    //do data access stuff here 
}