如何在ASP.Net中实现现场级安全性?

时间:2009-01-16 11:39:50

标签: asp.net security

我有一个包含20个字段的.aspx表单,必须根据用户角色和订单记录的状态进行禁用。目前,该应用程序有5个角色和3个状态,因此我有300个不同的可能条件,我必须考虑。

我的第一个想法是将每个排列存储在一个表中,然后通过循环遍历字段来设置页面加载时的字段。有没有更好的办法?请注意,我使用的是.Net 2.0而不是MVC。

3 个答案:

答案 0 :(得分:5)

我可能会存储每个字段的详细信息,然后是可以编辑它们的角色和状态,并按照这种方式进行。

系统有哪些规则?基本上,真的有300种可能的条件吗?或者是否真的某些字段只能针对特定状态进行编辑,然后只有某些角色可以编辑这些字段?或者某些字段是否也适用于某些角色?

如果更多的是前者,我可能会有这样的事情:

三个主要表格(如果您添加字段,角色或状态,则可以轻松扩展):

  • 字段
  • 角色
  • 状态

然后是两个链接表:

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

然后,对于任何给定的订单和用户,您可以找到哪些字段可以编辑订单的当前状态和用户角色,并且当您处理字段时,相应地设置访问权限 - 但是您设置控件 - 动态根据您返回的集合或页面上的静态生成它们。

如果您遇到角色可以覆盖状态的问题,您还可以在字段/角色表中存储一个布尔值,指示无论状态如何,该字段都应该是可用的。

答案 1 :(得分:3)

与其他响应者一样,我们也使用名为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

答案 2 :(得分:0)

我建议使用第三方框架来实现这一目标。我们在项目中使用CSLA框架。它允许我们在现场级别设置授权。