Vb.net 基于多个因素(用户角色、位置等)的UI控件授权

Vb.net 基于多个因素(用户角色、位置等)的UI控件授权,vb.net,permissions,authorization,rbac,abac,Vb.net,Permissions,Authorization,Rbac,Abac,我有一个通过多个部门(地点)发送对象(本例中为订单)的工作流流程 每个流程阶段都使用相同的表单,但根据某些标准启用或显示UI的不同元素: 用户角色(用户是否有权执行此操作) 位置(当对象位于此位置时,是否可以更改此字段) 其他因素(此对象最初是否由该用户创建,是否已修改等) 目前,我的方法相当简单,但很难维护,非常特定于我使用的类,并且每次权限更改时都需要编译代码(通常是): 类别代码: Public Class Order Public ReadOnly Property Can

我有一个通过多个部门(地点)发送对象(本例中为订单)的工作流流程

每个流程阶段都使用相同的表单,但根据某些标准启用或显示UI的不同元素:

  • 用户角色(用户是否有权执行此操作)
  • 位置(当对象位于此位置时,是否可以更改此字段)
  • 其他因素(此对象最初是否由该用户创建,是否已修改等)
目前,我的方法相当简单,但很难维护,非常特定于我使用的类,并且每次权限更改时都需要编译代码(通常是):

类别代码:

Public Class Order

    Public ReadOnly Property CanEditHeader
        If Me.Location = "Sales" AndAlso Me.UserRole = "Salesman" AndAlso Me.CreatorID = Me.UserID AndAlso Me.Revision = 0 Then
            Return True
        Else
            Return False
        End If
    End Property

    ...

End Class
用户界面代码:

Public Class OrderUI

    Public ThisOrder As Order        

    Public Sub UpdateUI()

        If ThisOrder.CanEditHeader Then
            Me.HeaderPanel.Enabled = True
        End If
        ...
    End Sub

    ...

End Class
这段代码对于这个类来说太显式了,并且随着更复杂的权限的添加,可能会变得非常冗长:

Public ReadOnly Property CanEditHeader
    If Me.UserRole = "SuperUser" Then
        Return True
    ElseIf Me.OrderType = "SalesOrder" AndAlso Me.UserRole = "Salesman" AndAlso Me.CreatorID = Me.UserID AndAlso Me.Revision = 0 Then
        Return True
    ElseIf Me.OrderType = "DevelopmentOrder" AndAlso Me.UserRole = "Developer" AndAlso Me.CreatorID = Me.UserID AndAlso Me.Revision = 0 Then
        Return True
    Else
        Return False
    End If
End Property
我的一个想法是给用户和类都授予权限,并允许它们在哪里相交,但这似乎没有多大好处,现在我必须在两个地方维护我的权限:

If ThisUser.CanEditHeader AndAlso ThisOrder.CanEditHeader Then
     Me.HeaderPanel.Enabled = True
End If
我一直在尝试研究基于属性的访问控制(ABAC)的例子,这似乎是一种适合我的方法,但我很难找到好的例子,让我绞尽脑汁


有人能提供一个更优雅的解决方案(ABAC或其他)的例子来更好地处理这个问题吗?

基于您所说的,例如:

[…]但是它很难维护,非常特定于我正在使用的类,并且要求每次权限更改时都要编译代码(通常是这样)

听起来您需要一种从应用程序外部化授权的方法,而基于属性的访问控制正是针对这种方法的。所以,你走的是正确的道路!:-)

首先,完全公开,我是一家提供基于属性的访问控制解决方案(有时称为动态授权)的公司的员工。然而,我将尝试告诉您如何以一种与供应商无关的方式实现所需

基于属性的访问控制和可扩展访问控制标记语言概述

是一种基于标准的语言,用于基于属性的访问控制。它定义了描述如何评估访问请求的体系结构和处理模型

该体系结构包含以下组件:

策略实施点(PEP):这是保护要保护的API/应用程序的组件。PEP拦截流,分析流,并向PDP发送授权请求(见下文)。然后,它会收到一个执行的决定(许可/拒绝)

策略决策点(PDP)接收授权请求(例如,Alice是否可以查看记录#123?),并根据已配置的策略集对其进行评估。它最终做出一项决定,并将其发回政治公众人物。在评估过程中,PDP可能需要额外的元数据,例如用户的职务。为此,它可以求助于政策信息点(PIP)

策略信息点(PIP)是PDP和底层数据源(如LDAP、数据库、REST服务)之间的接口,其中包含有关用户、资源或其他信息的元数据。您可以使用PIP检索PDP在运行时可能需要的信息,例如风险分数、记录位置或其他信息

将应用程序视为强制执行点

为了更有效地管理您的授权,如前所述,我们需要一个解决方案,从请求应用程序的应用程序逻辑外部处理决策。请求应用程序通常被称为策略实施点,因为授权策略在此点实施(有意义,对吗?)

因此,在应用程序中,您将需要与外部授权服务器通信的方法。例如,您可以调用一个方法来批准如下所示的采购订单:

    XacmlAuthorizationDecision d = PDPUtil.PurchaseOrderAuthorization(User.Identity.Name, "approve", 
po.Identifier.ToString(), "purchase order",Request);
此方法的内容必须添加请求者的必要属性(主题-即用户的职称、部门、培训,使其有资格访问),以及与资源相关的任何属性。关于资源的属性可以与资源的标识符(即,资源id=12345)一样简单

可以做更多的工作来实现具有环境属性的更细粒度的访问控制,如时间

在幕后,在您调用的方法的内容中,当然必须有一个到决策服务器(称为策略决策点)的HTTP。我们刚才讨论的请求中的属性将传递到此策略决策点

决策者-政策决策点(PDP)

策略决策点提供策略实施点(PEP)负责实施的决策

XACML语言具有基于标准的响应,以促进互操作性和通用术语。这意味着无论您是购买ABAC产品(如Axiomatics)还是编写自己的ABAC软件,如果您遵循标准,则可以在不影响授权的情况下更换软件

来自XACML引擎的JSON响应示例如下所示:

  {
  "Response" : {
    "Decision" : "Permit",
    "Status" : {
      "StatusCode" : {
        "Value" : "urn:oasis:names:tc:xacml:1.0:status:ok"
      }
    }
  }
 }
<xacml-ctx:Response xmlns:xacml-ctx="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17">
  <xacml-ctx:Result>
    <xacml-ctx:Decision>Deny</xacml-ctx:Decision>
    <xacml-ctx:Status>
      <xacml-ctx:StatusCode Value="urn:oasis:names:tc:xacml:1.0:status:ok"/>
    </xacml-ctx:Status>
  </xacml-ctx:Result>
</xacml-ctx:Response>
如果使用SOAP,则响应示例如下所示:

  {
  "Response" : {
    "Decision" : "Permit",
    "Status" : {
      "StatusCode" : {
        "Value" : "urn:oasis:names:tc:xacml:1.0:status:ok"
      }
    }
  }
 }
<xacml-ctx:Response xmlns:xacml-ctx="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17">
  <xacml-ctx:Result>
    <xacml-ctx:Decision>Deny</xacml-ctx:Decision>
    <xacml-ctx:Status>
      <xacml-ctx:StatusCode Value="urn:oasis:names:tc:xacml:1.0:status:ok"/>
    </xacml-ctx:Status>
  </xacml-ctx:Result>
</xacml-ctx:Response>

否认
您的政治公众人物将收到此响应,需要应用程序逻辑来处理。例如,在拒绝上,您可能希望选择不显示特定的UI组件。在许可证上,您将显示UI组件。您可以在不影响性能的情况下轻松地为网页做出这些决定

如果你考虑过