我经常遇到并且没有解决方案的一个问题是限制或允许访问系统中的特定实体。有些公司(例如银行)对哪些员工可以访问某些信息有非常严格的政策。例如,特定分支机构的员工可以访问该特定分支机构的客户的帐户信息,但不能访问其他分支机构的客户。此外,在许多国家/地区设有分支机构的银行可能会受到法律限制,限制其他国家/地区的员工访问有关国内客户的信息。
我遇到的另一个例子是一个公共网站,其中用户属于特定实体(例如公司),并且可能只访问有关该实体的信息,而不是其他实体。
如果实体数量很少且固定,这不是问题。只需在活动目录中指定域组(如果您在Microsoft环境中工作,我就是这种情况),将用户添加到组并使用IsInRole()限制每个实体的访问。因此,如果系统中有一家名为ABC的公司,我会创建一个名为“Admins_ABC”的域名组或类似的东西,当用户尝试管理有关ABC的信息时,我会确保该用户是该组的成员。这不是AD打算使用的方式,但对于少数实体我发现它是合理的。
当实体数量经常变化以及需求变得更加详细时,复杂性会增加。我已经看到类似于NTFS中的安全性的安全性要求 - 一些用户(或用户组)应该能够访问某些实体(NTFS中的文件)或实体组(在NTFS中的目录上设置的权限被传播它的孩子们)。
我尽量避免这样的情况,因为它们往往是模型和代码的噩梦,而且它们通常变得很复杂,但我工作的客户经常需要解决这个问题。
就像我说的那样,我从来没有以好方式解决这个问题。您将如何以可重用的方式为此问题建模和开发解决方案?您知道可以使用的任何通用专有解决方案吗?
答案 0 :(得分:3)
我曾多次在这堵墙上击败我的头。
我遇到的最佳解决方案是在树层次结构中对所有内容进行建模,其中每个域类都是树中的一个分支,而实例是该分支的叶子。如果你需要保护部分实例,叶子可以有静脉。每个分支都有自己的分配操作(例如“读取”,“写入”,“删除”,“发布”)。使用相同的层次结构进行安全性,然后root将成为用户或组。最终得到的结构如下:
<domain> Project
|- <class> Person
| |- <instance> John
| |- <instance> Mary
|- <class> FormX
| |- <instance> John's Leave Form
...
并且为了应用安全性,您可能会有一个名为Administrators的组,可以对人员执行操作:
<group> Administrators
|- <class> Person: actions (Read, Create, Update, Suspend)
以及可以处理表单并培养新人的办公室管理员:
<group> Office Administrator
|- <class> Person: actions (Create)
|- <class> FormX: actions (Approve, Deny)
然后John可以用他自己的个人资料做点什么:
<user> John
|- <class> Person
| |- <instance> John: actions (Edit)
当我实现这个结构时,它使用的是C#和SQL Server 2000,因此我能够使用XML模式数据类型并对数据库执行安全性查询,或者[通常情况下]将一个人的安全性配置文件合并为一个树,以确定某人对实例,类或其他人的权利(我有<group>
s - 而不是安全组 - 在类上面的类中,以便于维护。)
包括 - 虽然我没有说明它 - 也很重要 - 每个动作都是权限,而不是布尔值,其中权限值为{ Allow, None, Deny }
,允许授予对该动词的访问权限,除非明确拒绝,否既不允许也不否认,并且无论如何都拒绝访问。
您从此结构中获得的一个优势是您可以在其中添加其他类型的分支,例如数据驱动的分类,并且仍然使用相同的API。
在我的具体实现中,我向方法和属性添加了自定义元数据属性,我必须在每个“安全”函数中调用SecurityManager.Test
方法作为最后一层授权(SecurityManager.Test
通常被调用到确定是否显示或隐藏表单的各个部分,并确定哪些按钮在UI中可见。现在我知道如果我必须再次实现相同的东西,我将使用PostSharp将安全测试注入我的域模型。
答案 1 :(得分:1)
您是否研究过Microsoft为.NET框架创建的Code Access Security模型?我自己只在几次看过它,但其中的一点是你可以锁定某些对象和方法,这样只有来自内部网络的用户才能真正调用该代码。或者类似地,只能从安装代码的机器本身调用维护方法,防止第三方破解维护例程。
Wikipedia对CAS进行了很好的总结:
来自15 Seconds的代码访问安全性(CAS),在 Microsoft .NET框架,是 微软的防范解决方案 执行不受信任的代码 特权行动。当CLR加载时 一个集会,它将获得证据 用于组装并使用它 识别代码组 装配属于。一个代码组 包含权限集(一个或多个) 权限)。执行代码的代码 特权操作将执行代码 访问需求将导致CLR 走上调用堆栈并检查 授予的权限集 在调用中组装每个方法 堆。代码组和权限 集合由确定 机器的管理员 定义安全策略。
This article对如何开展工作有一个很好的快速概述。