分层数据方案中的实体级访问控制

jun*_*gos 6 access-control claims-based-identity role-based role-base-authorization role-based-access-control

坦率地说,我对实体级授权有一个要求。我希望得到一些关于这个权限结构的指导,我如何在 .NET 4.5 中实现它,以及是否有办法改进它。

它是这样的:


我有一组结构如下的数据:

在此处输入图片说明

在哪里

  • aFleet是零个或多个的集合Cars
  • aFleet可以包含其他Fleets

舰队可以在以后重组和移动以用于组织目的。

我在系统中有多个具有与这些实体相关的权限的角色:

  • 车主:可以在车队中添加或移除汽车
  • 经理:为汽车分配司机
  • 司机:允许简单地驾驶汽车
  • 机械师:可以修理汽车

授权逻辑允许User系统中的 a 被授予对具有一个或多个角色的aFleet或 a 的访问权限Car

以下是一些有助于解释的场景:

  1. 如果我授予User Jim以角色访问Fleet #5 的权限Driver,他将被允许驾驶车队 #2 下的任何汽车。由此产生的权限允许他驾驶汽车 #4, 5, 6
  2. 如果我授予用户MauraCar #1作为机械师的访问权限,则由此产生的权限允许她只修理汽车 #1。
  3. 如果我授予用户Sarah访问 Fleet #2 的角色Owner和权限Mechanic,她可以添加和移除车队 #2, 4, 5并且她可以修理汽车 #1, 2, 3, 4, 5, 6 .
  4. 如果我授予用户杰里米访问船队#1作为Owner 舰队#6为Driver,所得到的权限让他添加和删除汽车所有车队驱动汽车#7,8,他不能开车超过#以外的任何其他汽车7 和 8。

这种实体级授权的好方法是什么?

如果重要的话,我们使用 .NET 4.5.1 和 EF6 Code First,构建在ASP.net Boilerplate 之上

小智 1

您想要实现的细粒度授权让我想起了CakePHP 的访问控制列表 (ACL) 描述中的访问控制对象(ACO - 想要的东西)和访问请求对象(ARO - 想要的东西) ,但有一些变化:

简而言之:

您拥有 ACO(车队和汽车),ARO(车主、经理、司机、机械师)将要求您提供 ACO(车队和汽车)。如果您想知道请求者是否有权访问某个对象,您可以找到该对象的路径(:Can John access "Car #3"?从根查找“Car #3”的路径:)Fleet #1 > Fleet #2 > Car #3,然后为每个节点分配默认权限“拒绝”,但切换如果该节点位于请求者的允许节点列表中,则将其设置为“允许”。如果最后一个节点以“允许”结尾,那么,好吧...允许,否则拒绝。

首先理解逻辑是关键。任何语言的实现都是其次的。

我希望它能为您指明正确的方向。

干杯,