自定义ACL授权并根据权限

时间:2016-01-25 23:19:00

标签: c# webforms authorization acl abac

我正在构建某种复杂的库存系统,接受供应商的报价等。

通常我会有读取/写入/编辑/删除等基本权限,我可以轻松更新每个页面上的读取和写入bool变量,以检查是否为true,否则执行此操作。

但事实并非如此。我有一些权限,如(Owner,SamePseudoCity),分别表示允许用户访问他只创建的记录,另一个表示返回属于PsuedoCity的记录作为用户。

目前,UI具有适用权限的局部变量,当UI从数据库请求某些数据时,它会调用BL,该BL首先获取用户有权使用的权限,并将它们绑定到UI / Page本地变量。

它还会检查权限列表是否包含“所有者”#39;然后它将获取UserID创建的记录,如果它包含' SamePseudoCity'它将获得同一城市的所有记录。

我不确定这是不是一个好的设计,如果我可以修改它。我知道这里没有对错,但有臭味的设计,好的设计和更好的设计。所以,如果有人在此之前实现了这一点,我只是在寻找一些想法。

解决我的问题需要花很多时间,如果它还不清楚请告诉我,我可以从我的代码中发布一些片段。

1 个答案:

答案 0 :(得分:2)

掌握您的要求

您需要的是一个能够满足您要求的授权框架。在你的帖子中,你提到你有

  • 权限,例如读/写/编辑/删除
  • 其他参数,例如所有者,SamePseudoCity意味着不同的东西:
    • 允许用户访问他创建的记录
    • 以用户身份返回属于PsuedoCity的记录。

基于属性的访问控制

您需要转向[tag:ABAC](基于属性的访问控制),这将使您能够使用属性(键值对)和策略定义您的需求。策略在称为策略决策点(PDP)的第三方引擎内维护和评估。

ABAC是由NIST定义的标准。它是RBAC(基于角色的访问控制)的演变。 XACML,可扩展访问控制标记语言是ABAC的实现,

您可以将应用于架构中的不同层,从UI(表示层)到业务层,一直到数据层。

政策以表示。

实施例

namespace stackoverflow{

首先定义属性

    namespace user{
        attribute identifier{
            category = subjectCat
            id = "user.identifier"
            type = string
        }   
        attribute city{
            category = subjectCat
            id = "user.city"
            type = string
        }           
    }
    namespace item{
        attribute owner{
            category = resourceCat
            id = "item.owner"
            type = string
        }
        attribute city{
            category = resourceCat
            id = "item.city"
            type = string
        }
    }
    attribute actionId{
        category = actionCat
        id = "actionId"
        type = string
    }

然后定义使用这些属性的策略

    /**
     * Control access to the inventory
     */
    policy inventory{
        apply firstApplicable
        /**
         * Anyone can view a record they own
         */
        rule viewRecord{
            target clause actionId == "view"
            condition user.identifier == item.owner
            permit
        }
        /**
         * Anyone can view a record that is in the same city
         */
        rule viewRecordsSameCity{
            target clause actionId == "view"
            condition user.city == item.city
            permit          
        }
    }
}

下一步

然后,您需要部署策略决策点/策略服务器。您可以从以下几种中进行选择:

  • Axiomatics Policy Server(免责声明我为Axiomatics工作)
  • SunXACML
  • Oracle Entitlements Server
  • WSO2 Identity Server

如果要将策略应用于UI和数据库,则可以通过名为Data Access Filter MD的Axiomatics产品使用名为动态数据屏蔽的功能。

ADAF MD Architecture

更新

OP稍后评论了以下内容

  

ABAC"从来没有听说过这听起来很棒但是我想我需要访问专用服务器或VPS才能安装PDP,对吗? ..我知道这可能太多了,但我有3个问题,我可以通过编程方式更改规则吗?是否有可能实现这样的场景:每个产品都有一个伪城市,每个经理都有一个伪城市,经理只允许访问他们自己的城市产品?是否有可能做简单的读/写/编辑规则,并隐藏和显示基于此的UI? -

首先,让我们从ABAC架构图开始:

  • PEP是政策执行点,负责保护您的应用,API和数据库。它执行授权决定。
  • PDP是政策决策点,负责评估政策和做出决策。它处理从PEP收到的请求并返回授权决策(Permit,Deny)。
  • PAP是您定义和管理政策的政策管理点
  • PIP是政策信息点。它是PDP用于连接第三方属性源的接口,例如用户LDAP,数据库或Web服务。当PDP需要了解有关用户或资源的更多信息时,PDP会使用PIP。

ABAC XACML Architecture

  

我认为我需要访问专用服务器或VPS才能安装PDP,对吧?

是的,您可以在服务器(或云端)上安装PDP。它成为您基础设施的一部分。

  

我可以通过编程方式更改规则吗?

是的,你可以。 Axiomatics PAP有一个API,您可以使用它以编程方式上载,导出和创建策略。

  

是否有可能实现这样的场景:每个产品都有一个伪城市,每个经理都有一个伪城市,经理只允许访问他们自己的城市产品?

是的,这实际上就是我在原始例子中所写的,那就是ABAC的美丽。您编写的单一政策无论城市数量多少都有效:A user can view a record if user.city==record.city

  

可以做简单的读/写/编辑规则,并根据它隐藏和显示UI吗?

是的,您可以在策略中使用任意数量的属性。例如,您可以:

  • 拒绝用户访问其城市以外的记录
  • 用户可以查看记录
  • 用户可以编辑他们拥有的记录
  • 用户可以批准他们不拥有的记录

您可以使用逻辑来驱动UI或业务层甚至数据层的授权。所以你可以问PDP:

  • 我可以显示“编辑”按钮吗?
  • 我可以显示详细信息按钮吗?
  • 我可以显示删除按钮吗?