如何防止用户使用dotnet核心和RESTful API访问其他用户的数据?

时间:2017-03-07 17:11:38

标签: .net api authorization

我正在努力找到一个简单问题的最佳解决方案,而这个问题并没有在很大程度上讨论过。

我的应用程序有很多用户可以创建和编辑数据。用户应该只能看到和编辑他的数据,而不是其他人的数据。

想想Alice,餐厅A有菜单菜单A,Bob有餐厅B和菜单菜单B.

我有CRUD餐馆和菜单的API,我可以很容易地只授权具有正确声明和角色的登录用户。我现在要做的是阻止Bob访问Alice的餐厅或菜单,反之亦然。 例如,Bob应该授权PUT /api/restaurants/B,但应该未经授权PUT /api/restaurants/A甚至PUT /api/restaurants/A/menus/x

可能的解决方案是此处提供的解决方案ASP.NET MVC Attribute to only let user edit his/her own content。此解决方案需要创建自定义Authorize属性以主动检查记录的用户是否是所访问实体的专有权。实体具有userId字段以检查发出请求的用户是否是数据的所有者。 这个解决方案很干净,但缺乏一些功能。 模型中的每个实体都应该有一个userId字段,并且只能由所有者访问或者我需要导航到授权模型的根实体的每个实体(例如,访问菜单我需要查询父实体Restaurant来检查如果MenuB在用户拥有的餐馆内)。 要实现多个所有者(例如餐馆经理),逻辑将会复杂得多。我也担心这里的开销,因为基本上每个调用都需要做一些查询来检查数据访问,但这可能不是问题。

有最好的做法吗?

1 个答案:

答案 0 :(得分:6)

您要做的是实施基于属性的访问控制或

在ABAC体系结构中,您有一个策略执行点(PEP)的概念,它拦截API调用并确定调用是否应该通过。 PEP将API调用转换为授权请求,并将其发送到中央策略决策点(PDP)。

以下架构总结了该流程。

ABAC Architecture Applied to .Net API

PDP配置了一组策略,用于确定允许的内容和拒绝的内容。例如,您可以编写如下政策:

  • 餐厅老板可以查看餐厅页面
  • 餐厅老板可以编辑该餐厅的菜单。
  • 如果餐馆是公共的,客户可以查看任何餐馆的菜单。

您可以在两种语言中撰写政策:

例如,在ALFA中,策略如下所示:

{{1}}

您只需要使用XACML 3.0策略决策点。有Java和.NET实现以及商业实现。看看这个blog post on .Net authorization