簡體   English   中英

如何在ASP.Net中實現現場級安全性?

[英]How do you achieve field level security in ASP.Net?

我有一個包含20個字段的.aspx表單,必須根據用戶角色和訂單記錄的狀態禁用。 目前,該應用程序有5個角色和3個狀態,因此我有300個不同的可能條件,我必須考慮。

我的第一個想法是將每個排列存儲在一個表中,然后通過循環遍歷字段來加載頁面時設置字段。 有沒有更好的辦法? 請注意,我使用的是.Net 2.0而不是MVC。

我可能會存儲每個字段的詳細信息,然后是可以編輯它們的角色和狀態,並以這種方式執行。

該系統有哪些規則? 基本上,真的有300種可能的條件嗎? 或者是否真的某些字段只能針對特定狀態進行編輯,然后只有某些角色可以編輯這些字段? 或者某些字段是否也適用於某些角色?

如果它更多的是前者我可能會有這樣的事情:

三個主表(如果添加字段,角色或狀態,則可以輕松擴展):

  • 字段
  • 角色
  • 狀態

然后是兩個鏈接表:

  • Field.Id和Role.Id
  • Field.Id和Status.Id

然后,對於任何給定的訂單和用戶,您可以找到哪些字段可以編輯訂單的當前狀態和用戶角色,並且在您處理字段時適當地設置訪問權限 - 但是您設置控件 - 要么動態生成它們在您收集的集合上,或靜態地在頁面上。

如果您遇到角色可以覆蓋狀態的問題,您還可以在字段/角色表中存儲一個布爾值,指示無論狀態如何,該字段都應該是可用的。

與另一個響應者一樣,我們也使用名為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

注意對CanReadPropertyCanWriteProperty的調用。 第二個參數指定如果用戶未被授權執行特定的讀/寫操作,則該方法應拋出異常。

CanReadPropertyCanWriteProperty的實現由框架的基類提供,但是在不采用整個CSLA框架的情況下應該是可重現的。 實現檢查AuthorizationRules數據結構,該數據結構定義允許/拒絕基於角色的讀/寫訪問權限。 通常,在創建對象期間會填充AuthorizationRules結構。

將相同的CanReadPropertyCanWriteProperty方法暴露給表示層允許您根據當前用戶的訪問權限啟用/禁用UI元素。 例如:

FirstNameTextBox.ReadOnly = Not CanWriteProperty("FirstName", false)

希望這些信息能為您提供開發自己實現的良好起點。 如果您有興趣了解有關CSLA的更多信息,請查看Expert C#2008 Business Objects

我建議使用第三方框架來實現這一目標。 我們在項目中使用CSLA框架。 它允許我們在現場級別設置授權。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM