ASP.Net MVC 3中的数据级授权

7
我需要开发一个用户管理应用程序。需要在数据级别授权用户,例如:
以银行为例: 1. 客户 - 例如:银行1、银行2、银行3、银行4。 2. 分行州 - 例如:州1、州2、州3、州4。 3. 分行地区 - 例如:地区1、地区2、地区3、地区4。 4. 设施 - 支票、直接借记、定期指令等。
当用户登录时,他将只能看到一些客户、一些州分行、一些地区分行,这取决于在用户管理应用程序中分配给他的分行、设施等。这些针对不同的用户进行更改。
请问是否有任何标准工具可用于此级别的授权或者如果没有,哪种数据库模型最好?

你所说的是基于实体的授权。据我所知,目前没有可用的工具,因为创建通用工具会很困难。 - Brian Mains
3个回答

5

您需要实现自己的授权机制,您需要创建一个控制表,用于存储用户访问级别(假设很多事情),例如:

UserAuthorization (UserId, EntityId, EntityType)

用户Id:指向用户的引用。

实体Id:您想授予访问权限的元素的Id。

实体类型:您想授予访问权限的元素类型(客户端、州、地区、设施)。

+--------+----------+------------+
| UserId | EntityId | EntityType |
+--------+----------+------------+
|      1 |        2 | CLIENT     |
|      1 |        2 | STATE      |
|      1 |        3 | DISTRICT   |
+--------+----------+------------+

你可以使用整数来表示EntityType,为了举例我将它写成了文本形式。

1

您可以查看ClaimsPrincipal并使用基于声明的授权。在.Net 4.5中,WIF已经集成。您可以在此处http://msdn.microsoft.com/en-us/library/ms729851.aspx查看摘要。

您可能需要围绕系统中的每个实体创建访问控制列表。最终,您需要一种简单的方法来唯一定义实体,我认为使用GUID。然后需要一个针对该GUID的声明。如果直接按实体授予访问权限,则可能会得到大量声明,您可以显然变得更加复杂,并要求读取、写入类型的权限。

最终,您是否想要在单个实体上定义访问权限?某种形式的分组可能更好?如果您可以管理银行,则可以管理其所有状态,如果您管理其区域,则可以管理所有区域分支等。

我建议将用户分组并为组分配访问权限。当您在NTFS中管理文件时,很少发现自己授予对单个文件的访问权限。

如果您为实体组授予权限,请首先进行某种形式的组检查,如果他们没有该声明,则进行实体检查。

可能需要使用http://msdn.microsoft.com/en-us/library/system.security.claims.claimsauthorizationmanager.aspx 进行一些自定义设置。传递你想要编辑银行等方面的声明(claim),然后它将检查你是否具有访问该特定银行的权限。我认为你必须在CheckAccess方法中为ACL执行逻辑。

还要看看http://thinktecture.github.com/Thinktecture.IdentityModel.45/

我还发现了以下帖子http://leastprivilege.com/2012/06/24/approaches-to-server-side-authorization/ - 请阅读Lucero最后的建议。基本上就是如上所述


答案太模糊了。他期望授权访问单个实体。虽然我写了很多关于声明的应用程序,但我无法想到一种简单的方法来使用声明对这种细粒度的授权进行建模。如果您有聪明的想法,请在回答中提供更详细的信息。 - Wiktor Zychla
通常情况下,对实体进行授权并不容易。这需要付出努力 :) - GraemeMiller
@GraemeMiller 我同意实体级别的授权会给数据库设计增加复杂性,需要额外的连接/查询来确定哪些元素可以列出/编辑/查看,你的存储库/LINQ/EF/数据访问代码会变得有点混乱和臃肿,但这就是开发人员的生活 =) - JOBG

0

感谢回复。请查看样本数据。它可以达到三个/n个级别。

User1d 用户名

USR1      John    
USR2      William
USR3      Joseph
USR4      Mathew
USR5      George

客户端ID 客户端名称

CL1         Barclays
CL2         LLoyds TSB
CL3         Natwest
CL4         Nationwide
CL5         HSBC

国家编号 国家名称

CON1        England
CON2        Wales
CON3        Scotland
CON4        Northern Ireland

国家ID 城市ID 城市名称

CON1        CTY1      Liverpool 
CON1        CTY2      Waterloo
CON1        CTY3      Piccadilly
CON2        CTY4      Cardiff   
CON2        CTY5      Ammanford
CON2        CTY6      Abergele
CON3        CTY7      Glasgow
CON3        CTY8      Edinburgh
CON3        CTY9      Aberdeen
CON4        CTY10     Belfast
CON4        CTY11     Hannahstown
CON4        CTY12     Springfield

国家编号 城市编号 分支机构编号 分支机构名称

CON1        CTY1      BRC1        Branch1
CON1        CTY1      BRC2        Branch2
CON1        CTY1      BRC3        Branch3
CON2        CTY4      BRC4        Branch4
CON2        CTY4      BRC5        Branch5
CON2        CTY4      BRC6        Branch6

用户ID 客户端ID 国家ID 城市ID 分支机构ID

 USR1      CL1         CON1        CTY1      BRC1        
 USR1      CL1         CON1        CTY1      BRC2        
 USR2      CL2         CON1        CTY1      BRC1
 USR2      CL2         CON1        CTY1      BRC2  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接