【问题标题】:Data Level Authorization in ASP.Net MVC 3ASP.Net MVC 3 中的数据级授权
【发布时间】:2012-12-21 14:14:57
【问题描述】:

我必须开发一个用户管理应用程序。我需要在数据级别对用户进行授权,例如:

以银行为例:

  1. 客户 - 例如:Bank1、Bank2、Bank3、Bank4。
  2. 分支状态 - 例如:Stat1、State2、State3、State4
  3. 分行区 - 例如:District1、District2、District3、District4
  4. 设施 - 支票、直接借记、常规订单

当用户登录时,他将只能看到一些客户、一些州分支机构、一些地区分支机构,这取决于在用户管理应用程序中分配给他的分支机构、设施等。这些变化针对不同的用户。

请任何人都可以帮助我获得这种级别的授权任何可用的标准工具,或者如果没有,那么好的数据库模型是什么?

【问题讨论】:

  • 你说的是基于实体的授权。 AFAIK,没有任何可用的工具,因为很难创建通用的东西。

标签: asp.net sql asp.net-mvc-3


【解决方案1】:

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

UserAuthorization (UserId, EntityId, EntityType)

UserId:对用户的引用。

EntityId:您要授予访问权限的元素的 ID。

EntityType:您要授予访问权限的元素类型(客户、州、地区、设施)

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

您可以使用并且应该使用整数来表示 EntityType,我只是为了示例而将它写成文本。

【讨论】:

    【解决方案2】:

    您可以查看 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 做一些自定义的事情。传入您要编辑银行等的声明,然后检查您是否有权访问该特定银行。我认为您必须在 CheckAccess 方法中为 ACL 做逻辑。

    也可以看看http://thinktecture.github.com/Thinktecture.IdentityModel.45/

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

    【讨论】:

    • 答案太模糊了。他希望授权访问各个实体。尽管我围绕声明编写了十几个应用程序,但我想不出一种简单的方法来用声明对如此细粒度的授权进行建模。如果您有一个聪明的想法,请用更详细的信息扩展您的答案。
    • 在实体级别进行授权通常不是一件容易的事。这将需要工作:)
    • @GraemeMiller 我同意实体级授权,增加数据库设计的复杂性,添加额外的连接/查询以了解要列出/编辑/查看哪些元素,您的存储库/linq/EF/数据访问代码获取有点凌乱和肥胖,但这就是开发人员的生活 =)
    【解决方案3】:

    感谢您的回复。请查找示例数据。它可以达到三个/n个级别。

    User1d 用户名

    USR1      John    
    USR2      William
    USR3      Joseph
    USR4      Mathew
    USR5      George
    

    ClientId 客户名

    CL1         Barclays
    CL2         LLoyds TSB
    CL3         Natwest
    CL4         Nationwide
    CL5         HSBC
    

    CountryId 国家名称

    CON1        England
    CON2        Wales
    CON3        Scotland
    CON4        Northern Ireland
    

    CountryId CityId CityName

    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
    

    CountryId CityId BranchId BranchName

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

    UserId ClientId CountryId CityId BranchId

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多