C# 复杂(?)访问控制

C# 复杂(?)访问控制,c#,access-control,C#,Access Control,我有一个我认为可能是一个相对复杂的访问控制情况(没有太多经验,我可能完全错了)。此系统是一个专用/内部桌面应用程序,如果这有任何区别的话 我使用的系统是针对人员的证书(表格使用粗体)。只有某些用户可以访问此系统,使其受到一定程度的控制,但需要进一步控制。例如;并非所有用户都应该能够访问属于管理层的人员的证书,这实际上应该仅限于人力资源部。此外,某些用户可以访问任何人员,但只能访问某些证书 当前的想法是在证书和人员中添加一个具有权限/访问级别的int字段。与设置类似。用户表还将有一个“Access

我有一个我认为可能是一个相对复杂的访问控制情况(没有太多经验,我可能完全错了)。此系统是一个专用/内部桌面应用程序,如果这有任何区别的话

我使用的系统是针对人员的证书(表格使用粗体)。只有某些用户可以访问此系统,使其受到一定程度的控制,但需要进一步控制。例如;并非所有用户都应该能够访问属于管理层的人员的证书,这实际上应该仅限于人力资源部。此外,某些用户可以访问任何人员,但只能访问某些证书

当前的想法是在证书人员中添加一个具有权限/访问级别的int字段。与设置类似。用户表还将有一个“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
}

但是,由于之前没有对这种复杂程度进行过访问控制,我不确定我是否朝着正确的方向前进?

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

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

  • 当且仅当user.id==document.owner.id时,用户才能编辑文档
  • 当且仅当user.location==document.location时,用户才能查看文档
我最近在云身份峰会上做了一个关于授权外部化的演讲。你可以找到我的幻灯片

嗯,,
David。

层级结构可能会起作用,例如,如果您有一个员工树,您是否希望经理能够查看其直接下属的证书?这在技术上是正确的。然而,它并没有真正归结到那个层次;人力资源部主要负责管理每个人的证书。也就是说,人员后勤是指需要获得某些证书的人员,因为他们是与客户联络的人员(但他们不需要获得CVs,即HR希望使用系统跟踪的CVs),即此人符合要求,这些证书证明了这一点。对于简单的系统,我通常使用一个
特权表(
PrivilegeId
Name
ShortName
,在应用程序代码中使用,
Description
)和一个
UserPrivileges
表来授予访问权限,并使用一个表来控制谁可以授予/撤销特权,例如,
useradministersprivillege
。这避免了位掩码提供的位篡改和位耗尽的可能性。我已经做过很多系统,它们的层次结构有好几个层次,隐式的(默认情况下,用户总是可以看到他们的分支/部门/公司的文档)和显式的访问不同层次的权限。看起来是一个不错的系统。我不确定它是否能与我正在开发的一款兼容;它是一个与MSSQL数据库通信的C#WinForms桌面应用程序……据我所知,规则要么需要硬编码(肯定不是最好的选择),要么保存在数据库中,因为这是唯一集中的部分。XACML中的规则表示为XACML。然后使用PDP(例如Balana(开源)或Axiomatics(供应商)对其进行评估。然后,您可以使用PEP SDK编写您自己的客户端,以保护您的应用程序……它暂时被搁置一旁。目前,开发人员恰好是唯一需要访问实时数据的人,因此目前还不需要访问控制。(我知道以后可能更难实现,但这是老板的决定,不是我的…)事实上,只要基于标准采用干净的体系结构/API驱动的体系结构,以后就可以轻松地添加XACML。发生这种情况时请告诉我。