【问题标题】:Practical Role Based Data Access Controls in ASP.NET MVC / SQL ServerASP.NET MVC / SQL Server 中基于角色的实用数据访问控制
【发布时间】:2013-11-06 01:07:06
【问题描述】:

我有一个 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 的角度来看,这确实是错误的(丑陋的地狱)和维护的噩梦。

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

【问题讨论】:

    标签: sql-server asp.net-mvc security database-design data-structures


    【解决方案1】:

    Role-based access control开始,你可以跳过纯定义中的角色,但应该能够像这样实现它:

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

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

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

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

    【讨论】:

    • 感谢您的评论,但这并没有真正提供任何实用的建议。就像我在原帖中所说的那样,记录归哪个组所有没有押韵或理由,这使您的建议无效。
    【解决方案2】:

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

    【讨论】:

    • 我只是想说明一下,因为有人问我为什么在每个组之前和之后的所有者列上都有一个逗号;即:,hr,group1,it,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 2010-09-11
    • 2011-11-02
    • 2014-01-04
    相关资源
    最近更新 更多