我正在为不断发展的系统开发REST API。一般来说,角色/声明访问控制工作完全像这样。
[HttpGet]
[Route("settings")]
[Authorization(Type = AuthorizationType.Admin, Permission = Permission.StoreSettings)]
public IHttpActionResult GetSettings() { /*...*/ }
如果我的用户能够更深入地控制访问权限,则会出现问题,如下图所示。这是系统的一个抽象示例。
如果我需要在其中一个区域查询某些内容,这很简单,但是当我需要从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));
显然很难维护,特别是如果我需要为系统带来另一个级别。
是否有任何框架可以处理这个或我可以实现的正式架构?
答案 0 :(得分:10)
是的。有一个名为ABAC的模型 - 或基于属性的访问控制(abac)就是这样做的。
ABAC是RBAC(基于角色的访问控制)的演变。您使用的基于声明的模型是RBAC的一种形式,您可以在其中为用户分配角色和权限。 RBAC在小型,简单的部署中运行良好,但在您需要扩展或 拥有关系 时往往会失败。在您的情况下,您希望根据用户和商店之间的关系来表达访问控制。
ABAC和RBAC都是由NIST,国家科学技术研究所定义的模型。
在ABAC中,您可以获得两种类型的构造:
使用ABAC,您可以拥有任意数量的策略,以满足许多不同的情况。
ABAC推荐的架构如下:
今天实施ABAC的主要标准是XACML,即可扩展访问控制标记语言(xacml)。它是一种技术中立的细粒度访问控制方法。今天有几种XACML实现:
网上有一些很好的资源可以转向
答案 1 :(得分:0)
是的,有准备使用框架,它适用于所有.net和非.net应用程序,你可以在这里查看,VisualGuard,我工作,它做你需要的所有事情非常容易在不需要编写任何代码的地方,只需插入它就可以动态创建限制(权限)。
每个权限对应一个或多个将激活,停用或修改应用程序功能的操作。
使用动态权限,这些操作仅在框架中定义和存储。在运行时,Visual Guard将动态加载并应用它们。因此,应用程序代码与安全代码完全分离。
你可以在这里查看