Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server ASP.NET MVC/SQL Server中实用的基于角色的数据访问控制_Sql Server_Asp.net Mvc_Security_Database Design_Data Structures - Fatal编程技术网

Sql server ASP.NET MVC/SQL Server中实用的基于角色的数据访问控制

Sql server ASP.NET MVC/SQL Server中实用的基于角色的数据访问控制,sql-server,asp.net-mvc,security,database-design,data-structures,Sql Server,Asp.net Mvc,Security,Database Design,Data Structures,我有一个ASP.NET MVC+SQL Server应用程序,每天有250个同时使用的用户,它使用AD/NTLM SSO来执行所有授权,使用自定义授权安全类来控制对控制器和基于用户和组的操作的访问 最近出现了一个难题,数据库的50K+帐户记录将由不同的组进行不同程度的管理: 所有用户都可以查看大多数记录,某些记录只能 将由特定部门的特定用户/组编辑 成为能够编辑任何集团所有记录的管理和支持小组成员 等等 这不是谁可以访问控制器中的哪些功能/表单等的问题,而是必须施加的数据所有权限制的难题。我

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

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

  • 所有用户都可以查看大多数记录,某些记录只能
  • 将由特定部门的特定用户/组编辑
  • 成为能够编辑任何集团所有记录的管理和支持小组成员
  • 等等
这不是谁可以访问控制器中的哪些功能/表单等的问题,而是必须施加的数据所有权限制的难题。我猜这意味着我需要一些额外的安全层来实现行级安全

我正在寻找一种实用而健壮的方法来解决当前应用程序框架内的数据所有权问题,同时将性能影响降至最低,因为其他更大的数据表可能也需要采用同样的方法。最初将有大约5个所有权群体,但在不久的将来将逐渐增加到25到100个

可悲的是,这里没有硬性规定可以实施。。除了记录主键id之外,没有任何押韵或理由可以解释谁拥有什么

为了解决这个问题,我想创建一个包含
owner\u roles
的表,并将其映射到
users
表,然后创建另一个名为
accounts\u 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
但这样做将创建一个25000行的表,并且很容易得到一些糟糕的性能。看看Facebook和其他网站,这肯定是一个必须实现的常见问题,但我不太愿意引入这样的表,因为它可能会造成严重的性能问题

我认为实现这一点的另一种方法是,在accounts表中添加一个额外的列,该列是一个以逗号分隔的复合字段,将包含具有编码权限集的所有者,即:

id   owners
1    ,hr,    
2    ,hr,
3    ,hr,it,
4    ,it,
然后使用“like”语句添加要搜索的自定义类。。如果登录用户角色为“it”,并且在所有者名称中保留且不允许使用逗号:

SELECT * FROM accounts WHERE owners LIKE '%,it,%'
。。。然而,从DBA的角度来看,这确实是一个错误(非常丑陋)和一个维护噩梦

关于如何在不破坏我的网站的情况下实现这一点,有什么切实可行的方法吗?

首先,您可以跳过纯定义中的角色,但应该能够这样实现:

  • 每个用户都可以在一个或多个组中,如管理员、支持、it、hr
  • 每个数据行都有一个所有者,如hr
在访问时,检查访问权限:管理员可以查看和编辑所有行。Support+它可以查看每一行,并可以编辑其中的行等。这样,您只需要(用户组+行访问)数据库中的新行,而不需要(用户组*行访问)

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


最初概念中的角色允许用户选择他/她想要使用的权限,在您的界面中会有“使用管理员权限解锁”之类的功能。

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

感谢您的评论,但这并不能真正提供任何实用的建议。正如我在原始帖子中所说,没有押韵或理由说明哪些记录属于哪个组,这使你的建议无效;i、 e.:,人力资源,第一组,it,