2009-01-16 78 views
5

我有一個帶有20個字段的.aspx表單,必須根據用戶角色和訂單記錄的狀態禁用。目前該應用程序有5個角色和3個狀態,所以我有300個不同的可能條件,我必須考慮。如何在ASP.Net中實現現場級別的安全性?

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

回答

5

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

該系統的規則是什麼?基本上,真的有300個可能的條件嗎?或者,確實某些字段只能編輯某些狀態,然後只有某些角色可以編輯這些字段?還是某些字段可用於某些角色?

如果是越前的我可能有這樣的事情:

三個主表(可以很容易地擴展,如果你添加一個字段,角色或狀態):

  • 角色
  • 狀態

然後兩個連接表:

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

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

如果您在角色可以覆蓋狀態的問題中,還可以在字段/角色表中存儲布爾值,指示該字段是否應該可用,而不管狀態如何。

0

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

3

與另一個響應者一樣,我們也使用名爲CSLA的業務對象框架。 CSLA通過要求類開發人員在屬性獲取/設置調用中執行安全檢查來實現字段級安全檢查。一個典型的財產實施看起來是這樣的:

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