2009-01-16 57 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

相关问题