【问题标题】:Complex(?) Access Control复杂(?)访问控制
【发布时间】:2014-09-15 10:34:12
【问题描述】:

我认为可能是一个相对复杂的访问控制情况(没有太多经验,我可能完全错了)。如果这有什么不同的话,这个系统是一个私人/内部桌面唯一的应用程序。

我正在为人员跟踪证书的系统(使用粗体表示表格)。只有特定的用户可以访问此系统,使其受到一定程度的控制,但需要进一步控制。例如;并非所有用户都应该能够访问Personnel证书,这应该仅限于HR。此外,某些用户可能会访问任何人员,但只能访问某些证书

目前的想法是向 CertificatesPersonnel 添加一个字段,该字段是具有权限/访问级别的 int。类似于this 设置。 User 表也会有一个“AccessLevel”字段,以便进行比较。

不确定访问级别的数量,目前考虑如下;

[Flags]
public enum AccessLevel
{
    None,
    ReadOnly,
    Normal, // Can view all Certificates and Personnel that aren't set to Management
    Management, // For "sensitive" Personnel and/or Certificates
    HR, // Full access
    Admin // Permission control/editing
}

虽然之前没有做过这种复杂程度的访问控制,我不确定我是否朝着正确的方向前进?

【问题讨论】:

  • 层次结构可能会起作用,例如如果您有一棵员工树,您是否希望经理能够看到他们直接下属的证书?
  • 这在技术上是正确的。不过,它并没有真正归结为那种层次结构。 HR主要负责管理每个人的证书。也就是说,人事物流是需要访问某些证书的人,因为他们是与客户联络的人(但他们不需要访问说,简历 - 人力资源部门希望使用系统跟踪),即人符合这些证书的要求。
  • 对于简单的系统,我通常使用Privileges 的表(PrivilegeIdNameShortName 用于应用程序代码,Description)和UserPrivileges 的表授予访问权限和一个表来控制谁可以授予/撤销权限,例如UserAdministersPrivilege。这避免了位掩码提供的位摆弄和位用完的可能性。我已经完成了许多具有隐式(默认情况下用户总是可以看到他们的分支机构/部门/公司的文档)和显式访问不同级别权限的层次结构的系统。

标签: c# access-control


【解决方案1】:

您应该避免在代码中编写授权逻辑。相反,您应该尝试将您的授权外部化。使用XACML,可扩展访问控制标记语言。 XACML 为您提供了一个可扩展的架构、一种足够丰富的策略语言来满足您的授权用例(以及更多)以及更高级的用例。

使用 XACML,您可以编写有关不同操作(查看、编辑、控制...)的规则,并且可以选择对您重要的参数/属性。例如你可以写:

  • 当且仅当 user.id == document.owner.id 时,用户才能编辑文档
  • 当且仅当 user.location == document.location 时,用户才能查看文档

我最近在 Cloud Identity 峰会上发表了关于外部化授权的演讲。你可以找到我的幻灯片here

HTH, 大卫。

【讨论】:

  • 似乎是一个不错的系统。我不确定它是否适用于我正在开发的那个;它是一个与 MSSQL 数据库通信的 C# WinForms 桌面应用程序……据我所知,规则要么需要硬编码(绝对不是最佳选择)要么保存在数据库中,因为这是唯一的集中的部分。
  • XACML 中的规则表示为 XACML。然后,您使用 PDP 对它们进行评估,例如Balana(开源)或 Axiomatics(供应商)。然后,您使用 PEP SDK 编写您自己的客户端来保护您的应用程序...
  • 暂时搁置了。目前,开发人员恰好是唯一需要访问实时数据的人,因此还不需要访问控制。 (我知道以后可能更难实现,但这是老板的决定,不是我的……)
  • 其实只要你采用干净的架构/基于标准的API驱动的架构,那么你以后可以很容易地添加XACML。发生这种情况时告诉我。
猜你喜欢
  • 2013-01-27
  • 2013-03-24
  • 2012-01-18
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 2011-06-17
相关资源
最近更新 更多