角色/索赔访问控制系统的替代方案

Yar*_*nko 6 asp.net authorization access-control entity-framework-6 abac

我正在为不断发展的系统开发REST API.一般来说,角色/声明访问控制工作完全像这样.

[HttpGet]
[Route("settings")]
[Authorization(Type = AuthorizationType.Admin, Permission = Permission.StoreSettings)]
public IHttpActionResult GetSettings() { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

当我有用户可以更深入地控制访问时,就会出现问题,如下图所示.这是系统的抽象示例.

用户类型

如果我需要在其中一个区域查询某些内容,那很简单,但是当我需要从中获取所有内容时Items,Departments我必须编写相同的丑陋代码,我无法重复使用.不是真正的代码,但看起来像这样.

Db.Items.Where(i =>
    i.Stores.Any(s => s.CityId == User.CityId) &&
    Db.UserDepartmentRights.Any(udr => udr.UserId == User.UserId && i.DepartmentId == udr.DepartmentId));
Run Code Online (Sandbox Code Playgroud)

它显然是丑陋的,很难维护,特别是如果我需要为系统带来另一个级别.

是否有任何框架可以处理这个或我可以实现的正式架构?

Dav*_*ard 15

就在这里.有一个名为ABAC的模型 - 或基于属性的访问控制()就是这样做的.

ABAC简介

ABAC是RBAC(基于角色的访问控制)的演变.您使用的基于声明的模型是RBAC的一种形式,您可以在其中为用户分配角色和权限.RBAC在小型,简单的部署中运行良好,但在需要扩展或建立关系时往往会失败.在您的情况下,您希望根据用户和商店之间的关系来表达访问控制.

ABAC和RBAC都是由NIST(国家科学技术研究所)定义的模型.

ABAC构造

在ABAC中,您将获得两种类型的构造:

  • 属性.属性可以是任何人和任何人.它们往往分为4个不同的类别或功能(如语法功能)
    • 主题属性:描述尝试访问的用户的属性,例如年龄,许可,部门,角色,职称......
    • 操作属性:描述正在尝试的操作的属性,例如读取,删除,查看,批准...
    • 资源(或对象)属性:描述被访问对象的属性,例如对象类型(医疗记录,银行账户......),部门,分类或敏感度,位置......
    • 上下文(环境)属性:处理访问控制方案的时间,位置或动态方面的属性
  • 策略是将属性汇集在一起​​以表达可能发生和不允许的内容的语句.ABAC中的政策可以是授予或拒绝政策.例子包括:
    • 如果文档与用户位于同一部门,则用户可以查看文档
    • 如果文档是所有者,并且文档处于草稿模式,则用户可以编辑文档
    • 拒绝在上午9点之前访问

使用ABAC,您可以拥有任意数量的策略,以满足许多不同的方案.

ABAC架构

ABAC推荐的架构如下:

ABAC/XACML架构

  • PEP或策略执行点负责保护您要应用ABAC的应用和数据.在您的情况下,您可能会使用拦截器(例如.NET MessageHandler).PEP检查请求并从中发出授权请求,并将其发送给PDP.
  • PDP或政策决策点是架构的大脑.这是根据已配置的策略评估传入请求的部分.PDP返回许可/拒绝决定.PDP还可以使用PIP来检索丢失的元数据
  • PIP或策略信息点将PDP桥接到外部属性源,例如LDAP或数据库.

ABAC实施

今天实现ABAC的主要标准是XACML,即可扩展访问控制标记语言().它是一种技术中立的细粒度访问控制方法.今天有几种XACML实现:

学到更多

你可以在网上找到一些好的资源