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

JoP*_*JoP 4 .net api authorization

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

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

想想有餐厅A和菜单菜单A的爱丽丝,以及有餐厅B和菜单菜单B的鲍勃.

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

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

有最好的做法吗?

Dav*_*ard 7

你想要做的是实现基于属性的访问控制或.

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

以下架构总结了该流程.

ABAC架构适用于.Net API

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

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

您可以使用两种语言编写策略:.

例如,在ALFA中,策略看起来像:

namespace restaurant{
    attribute userId{
        category = subjectCat
        id = "restaurant.userId"
        type = string
    }
    attribute owner{
        category = resourceCat
        id = "restaurant.resourceCat"
        type = string
    }
    policy restaurant{
        target clause objectType == "restaurant"
        apply firstApplicable
        rule ownerCanView{
            target clause actionId == "view"
            permit
            condition userId == restaurant.owner
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您所需要的只是使用XACML 3.0策略决策点.有Java和.NET实现以及商业实现.看看这篇关于.Net授权的博客文章.