如何在ASP.Net中实现现场级别的安全性?
我有一个带有20个字段的.aspx表单,必须根据用户角色和订单记录的状态禁用。目前该应用程序有5个角色和3个状态,所以我有300个不同的可能条件,我必须考虑。如何在ASP.Net中实现现场级别的安全性?
我的第一个想法是将每个排列存储在一个表中,然后通过循环遍历字段来设置页面加载时的字段。有没有更好的办法?请注意,我正在使用.Net 2.0和NOT MVC。
我可能会存储每个字段的详细信息,然后是可以编辑它们的角色和状态,并以此方式执行。
该系统的规则是什么?基本上,真的有300个可能的条件吗?或者,确实某些字段只能编辑某些状态,然后只有某些角色可以编辑这些字段?还是某些字段可用于某些角色?
如果是越前的我可能有这样的事情:
三个主表(可以很容易地扩展,如果你添加一个字段,角色或状态):
- 场
- 角色
- 状态
然后两个连接表:
- Field.Id和Role.Id
- Field.Id和Status.Id
那么对于任何给定的顺序,然后用户就可以找到哪些字段编辑为订单的当前状态,并用户角色,并且在您处理字段时适当地设置访问权限 - 但是您可以设置控件 - 根据您收回的集合动态生成它们,或静态地在页面上设置控件。
如果您在角色可以覆盖状态的问题中,还可以在字段/角色表中存储布尔值,指示该字段是否应该可用,而不管状态如何。
与另一个响应者一样,我们也使用名为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
通知书CanReadProperty
和CanWriteProperty
呼叫。第二个参数指定如果用户未被授权执行特定的读取/写入操作,该方法应抛出异常。
CanReadProperty
和CanWriteProperty
的实现由框架的基类提供,但应该是可重现的,而不需要采用整个CSLA框架。这些实现检查AuthorizationRules
数据结构,该数据结构根据角色定义谁被允许/拒绝读/写访问。在创建对象期间,通常会填充AuthorizationRules
结构。
向您的演示文稿层公开相同的CanReadProperty
和CanWriteProperty
方法,可以根据当前用户的访问权限启用/禁用UI元素。例如:
FirstNameTextBox.ReadOnly = Not CanWriteProperty("FirstName", false)
希望这些信息能为您提供一个开发自己的实现的良好开端。如果您有兴趣了解有关CSLA的更多信息,请查看Expert C# 2008 Business Objects。