1

我有一个 ASP.NET MVC + SQL Server 应用程序,每天有 250 个并发用户,它使用 AD/NTLM SSO 使用自定义授权安全类来执行所有授权,该安全类基于用户和组控制对控制器和操作的访问。

最近出现了一个难题,数据库的 50K+ 帐户记录将由不同的组在不同程度上进行管理:

  • 所有用户都可以查看大部分记录,某些记录只能查看
  • 由特定部门的某些用户/组编辑
  • 成为能够编辑任何组拥有记录的管理员和支持组
  • 等等

这不是谁可以访问哪些功能/表单/等的问题。在控制器中,而是必须施加数据所有权限制的两难境地。我猜这意味着我需要一些额外的安全层来实现行级安全。

我正在寻找一种实用且稳健的方法来解决当前应用程序框架中的数据所有权问题,同时将性能影响降至最低,因为很可能需要对其他更大的数据表施加相同的东西。最初将有大约 5 个所有权组,但在不久的将来会逐渐增加到 25 到 100 个。

可悲的是,没有可以在这里实施的硬性和快速的业务规则。除了记录主键 ID 之外,没有押韵或理由来判断谁拥有什么。

为了尝试修复它,我正在考虑创建一个表owner_roles并将其映射到users表,然后创建另一个名为的表accounts_ownership,如下所示:

tbl(PK),row(PK),owner(PK),view,create,modify,delete
accounts,1,hr,1,1,1,1
accounts,1,it,1,0,0,0
accounts,2,hr,1,1,1,1
accounts,2,it,1,1,1,1
accounts,3,it,1,0,0,0

但是这样做会创建一个 250K 行的表,并且很容易获得一些糟糕的性能。看看像 Facebook 和其他网站这样的网站,这一定是一个必须实施的常见事情,但我不愿意引入这样的表格,因为它可能会产生严重的性能问题。

我认为可以实现的另一种方法是向帐户表中添加一个额外的列,该列是一个以逗号分隔的复合字段,其中包含具有一组编码权限的所有者,即:

id   owners
1    ,hr,    
2    ,hr,
3    ,hr,it,
4    ,it,

然后添加一个自定义类以使用“like”语句进行搜索。假设登录的用户角色是“it”并且逗号是保留的,并且不允许在所有者名称中使用:

SELECT * FROM accounts WHERE owners LIKE '%,it,%'

...但是,从 DBA 的角度来看,这确实是错误的(丑陋的地狱)和维护的噩梦。

关于如何在不破坏我的网站的情况下实现这一点的任何实用方法?

4

2 回答 2

0

基于角色的访问控制开始,您可以跳过纯定义中的角色,但应该能够像这样实现它:

  • 每个用户都可以属于一个或多个组,例如 admin、support、it、hr
  • 每个数据行都有一个喜欢的所有者,hr

在 Access 上,检查访问权限:管理员可以查看和编辑所有行。Support+it 可以查看每一行,并可以从中编辑它们等。这样,您只需要(用户组 + 行访问)数据库中的新行,而不是(用户组 * 行访问)。

您的场景中的用户组应该可以在您的应用程序中进行硬编码,在 CMS 中通常有一个表定义分配给每个用户组的权限 - 使编码复杂但非常灵活。

原始概念中的角色允许用户选择他/她想要使用的权限,在您的界面中会有“使用管理员权限解锁”等。

于 2013-10-30T12:51:45.203 回答
0

主要是出于性能原因,我采用了列出的不太优雅的方法。这需要做一些工作,但是必须创建仔细的应用程序控件来强制执行诸如 id 中没有逗号之类的事情。

于 2013-11-19T22:39:22.930 回答