[英]How do you achieve field level security in ASP.Net?
我有一個包含20個字段的.aspx表單,必須根據用戶角色和訂單記錄的狀態禁用。 目前,該應用程序有5個角色和3個狀態,因此我有300個不同的可能條件,我必須考慮。
我的第一個想法是將每個排列存儲在一個表中,然后通過循環遍歷字段來加載頁面時設置字段。 有沒有更好的辦法? 請注意,我使用的是.Net 2.0而不是MVC。
我可能會存儲每個字段的詳細信息,然后是可以編輯它們的角色和狀態,並以這種方式執行。
該系統有哪些規則? 基本上,真的有300種可能的條件嗎? 或者是否真的某些字段只能針對特定狀態進行編輯,然后只有某些角色可以編輯這些字段? 或者某些字段是否也適用於某些角色?
如果它更多的是前者我可能會有這樣的事情:
三個主表(如果添加字段,角色或狀態,則可以輕松擴展):
然后是兩個鏈接表:
然后,對於任何給定的訂單和用戶,您可以找到哪些字段可以編輯訂單的當前狀態和用戶角色,並且在您處理字段時適當地設置訪問權限 - 但是您設置控件 - 要么動態生成它們在您收集的集合上,或靜態地在頁面上。
如果您遇到角色可以覆蓋狀態的問題,您還可以在字段/角色表中存儲一個布爾值,指示無論狀態如何,該字段都應該是可用的。
與另一個響應者一樣,我們也使用名為CSLA的業務對象框架。 CSLA通過要求類開發人員在屬性get / set調用中進行安全檢查來實現字段級安全性檢查。 典型的屬性實現如下所示:
Private mFirstName As String = ""
Public Property FirstName() As String
<System.Runtime.CompilerServices.MethodImpl(Runtime.CompilerServices.MethodImplOptions.NoInlining)> _
Get
CanReadProperty("FirstName", True)
Return mFirstName
End Get
<System.Runtime.CompilerServices.MethodImpl(Runtime.CompilerServices.MethodImplOptions.NoInlining)> _
Set(ByVal value As String)
CanWriteProperty("FirstName", True)
If value Is Nothing Then value = ""
If Not mFirstName.Equals(value) Then
mFirstName = value
PropertyHasChanged("FirstName")
End If
End Set
End Property
注意對CanReadProperty
和CanWriteProperty
的調用。 第二個參數指定如果用戶未被授權執行特定的讀/寫操作,則該方法應拋出異常。
CanReadProperty
和CanWriteProperty
的實現由框架的基類提供,但是在不采用整個CSLA框架的情況下應該是可重現的。 實現檢查AuthorizationRules
數據結構,該數據結構定義允許/拒絕基於角色的讀/寫訪問權限。 通常,在創建對象期間會填充AuthorizationRules
結構。
將相同的CanReadProperty
和CanWriteProperty
方法暴露給表示層允許您根據當前用戶的訪問權限啟用/禁用UI元素。 例如:
FirstNameTextBox.ReadOnly = Not CanWriteProperty("FirstName", false)
希望這些信息能為您提供開發自己實現的良好起點。 如果您有興趣了解有關CSLA的更多信息,請查看Expert C#2008 Business Objects 。
我建議使用第三方框架來實現這一目標。 我們在項目中使用CSLA框架。 它允許我們在現場級別設置授權。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.