Roles/Claims 访问控制系统的替代方案
Alternatives for Roles/Claims Access Control Systems
我正在为不断增长的系统开发 REST API。通常 Role/Claims 访问控制可以像这样完美地工作。
[HttpGet]
[Route("settings")]
[Authorization(Type = AuthorizationType.Admin, Permission = Permission.StoreSettings)]
public IHttpActionResult GetSettings() { /*...*/ }
当我的用户可以像下图那样更深入地控制访问时,就会出现问题。这是系统的抽象示例。
如果我需要查询其中一个区域的内容,这很简单,但是当我需要从 Departments
获取所有 Items
时,我必须编写同样丑陋的代码我真的不能重用。不是真正的代码,但看起来像这样。
Db.Items.Where(i =>
i.Stores.Any(s => s.CityId == User.CityId) &&
Db.UserDepartmentRights.Any(udr => udr.UserId == User.UserId && i.DepartmentId == udr.DepartmentId));
它显然很丑陋而且很难维护,尤其是当我需要将另一个级别引入系统时。
是否有任何框架可以处理这个问题或我可以实施的正式架构?
是的。有一个名为 ABAC 或基于属性的访问控制 (abac) 的模型可以做到这一点。
ABAC简介
ABAC 是 RBAC(基于角色的访问控制)的演变。您使用的基于声明的模型是一种 RBAC 形式,您可以在其中为用户分配角色和权限。 RBAC 在小型、简单的部署中运行良好,但当您需要扩展或当您 有关系 时往往会失败。在您的情况下,您想根据用户和商店之间的关系来表达访问控制。
ABAC和RBAC都是美国国家科学技术研究院NIST定义的模型
ABAC 构造
在 ABAC 中,您可以获得 2 种类型的结构:
- 属性。属性可以是任何事物和任何人。它们往往分为 4 个不同的类别或功能(如语法功能)
- 主题属性:描述尝试访问的用户的属性,例如年龄、权限、部门、角色、职位...
- 动作属性:描述正在尝试的动作的属性,例如阅读、删除、查看、批准...
- 资源(或对象)属性:描述正在访问的对象的属性,例如对象类型(病历、银行账户...)、部门、分类或敏感度、位置...
- 上下文(环境)属性:处理访问控制场景的时间、位置或动态方面的属性
- 政策是将属性组合在一起以表达可以发生和不允许发生的事情的声明。 ABAC 中的策略可以是授予或拒绝策略。例子包括:
- 如果文档与用户在同一部门,则用户可以查看文档
- 如果用户是所有者并且文档处于草稿模式,则用户可以编辑文档
- 上午 9 点前拒绝访问
使用 ABAC,您可以拥有任意数量的策略来满足许多不同的场景。
ABAC 架构
ABAC自带推荐架构如下:
- PEP 或政策执行点负责保护您要应用 ABAC 的应用程序和数据。在您的情况下,您可能会使用拦截器(例如 .NET MessageHandler)。 PEP 检查请求并从中生成授权请求,然后将其发送到 PDP。
- PDP 或策略决策点是架构的大脑。这是根据配置的策略评估传入请求的部分。 PDP returns 一个允许/拒绝决定。 PDP 还可以使用 PIP 来检索丢失的元数据
- PIP 或策略信息点将 PDP 桥接到外部属性源,例如LDAP 或数据库。
ABAC 实施
今天实现 ABAC 的主要标准是 XACML,即可扩展访问控制标记语言 (xacml)。它是一种技术中立的细粒度访问控制方法。今天有几种 XACML 实现:
- 供应商
- Axiomatics Policy Server
- IBM Tivoli 安全策略管理器
- Oracle 权利服务器
- 开源
- OpenAZ
- SunXACML
了解更多
您可以在网上找到一些不错的资源
是的,有现成可用的框架,它适用于所有 .net 和非 .net 应用程序,你可以在这里查看,VisualGuard,我为此工作,它做了所有的事情在不需要编写任何代码的地方,您可以非常轻松地需要,只需插入它,您就可以即时创建限制(权限)。
每个权限对应一个或多个将激活、停用或修改应用程序功能的操作。
使用动态权限,这些操作仅在框架中定义和存储。在运行时,Visual Guard 将动态加载和应用它们。结果,应用程序代码与安全代码完全分离。
你可以在这里查看
我正在为不断增长的系统开发 REST API。通常 Role/Claims 访问控制可以像这样完美地工作。
[HttpGet]
[Route("settings")]
[Authorization(Type = AuthorizationType.Admin, Permission = Permission.StoreSettings)]
public IHttpActionResult GetSettings() { /*...*/ }
当我的用户可以像下图那样更深入地控制访问时,就会出现问题。这是系统的抽象示例。
如果我需要查询其中一个区域的内容,这很简单,但是当我需要从 Departments
获取所有 Items
时,我必须编写同样丑陋的代码我真的不能重用。不是真正的代码,但看起来像这样。
Db.Items.Where(i =>
i.Stores.Any(s => s.CityId == User.CityId) &&
Db.UserDepartmentRights.Any(udr => udr.UserId == User.UserId && i.DepartmentId == udr.DepartmentId));
它显然很丑陋而且很难维护,尤其是当我需要将另一个级别引入系统时。
是否有任何框架可以处理这个问题或我可以实施的正式架构?
是的。有一个名为 ABAC 或基于属性的访问控制 (abac) 的模型可以做到这一点。
ABAC简介
ABAC 是 RBAC(基于角色的访问控制)的演变。您使用的基于声明的模型是一种 RBAC 形式,您可以在其中为用户分配角色和权限。 RBAC 在小型、简单的部署中运行良好,但当您需要扩展或当您 有关系 时往往会失败。在您的情况下,您想根据用户和商店之间的关系来表达访问控制。
ABAC和RBAC都是美国国家科学技术研究院NIST定义的模型
ABAC 构造
在 ABAC 中,您可以获得 2 种类型的结构:
- 属性。属性可以是任何事物和任何人。它们往往分为 4 个不同的类别或功能(如语法功能)
- 主题属性:描述尝试访问的用户的属性,例如年龄、权限、部门、角色、职位...
- 动作属性:描述正在尝试的动作的属性,例如阅读、删除、查看、批准...
- 资源(或对象)属性:描述正在访问的对象的属性,例如对象类型(病历、银行账户...)、部门、分类或敏感度、位置...
- 上下文(环境)属性:处理访问控制场景的时间、位置或动态方面的属性
- 政策是将属性组合在一起以表达可以发生和不允许发生的事情的声明。 ABAC 中的策略可以是授予或拒绝策略。例子包括:
- 如果文档与用户在同一部门,则用户可以查看文档
- 如果用户是所有者并且文档处于草稿模式,则用户可以编辑文档
- 上午 9 点前拒绝访问
使用 ABAC,您可以拥有任意数量的策略来满足许多不同的场景。
ABAC 架构
ABAC自带推荐架构如下:
- PEP 或政策执行点负责保护您要应用 ABAC 的应用程序和数据。在您的情况下,您可能会使用拦截器(例如 .NET MessageHandler)。 PEP 检查请求并从中生成授权请求,然后将其发送到 PDP。
- PDP 或策略决策点是架构的大脑。这是根据配置的策略评估传入请求的部分。 PDP returns 一个允许/拒绝决定。 PDP 还可以使用 PIP 来检索丢失的元数据
- PIP 或策略信息点将 PDP 桥接到外部属性源,例如LDAP 或数据库。
ABAC 实施
今天实现 ABAC 的主要标准是 XACML,即可扩展访问控制标记语言 (xacml)。它是一种技术中立的细粒度访问控制方法。今天有几种 XACML 实现:
- 供应商
- Axiomatics Policy Server
- IBM Tivoli 安全策略管理器
- Oracle 权利服务器
- 开源
- OpenAZ
- SunXACML
了解更多
您可以在网上找到一些不错的资源
是的,有现成可用的框架,它适用于所有 .net 和非 .net 应用程序,你可以在这里查看,VisualGuard,我为此工作,它做了所有的事情在不需要编写任何代码的地方,您可以非常轻松地需要,只需插入它,您就可以即时创建限制(权限)。
每个权限对应一个或多个将激活、停用或修改应用程序功能的操作。
使用动态权限,这些操作仅在框架中定义和存储。在运行时,Visual Guard 将动态加载和应用它们。结果,应用程序代码与安全代码完全分离。
你可以在这里查看