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

2024-03-09

我正在尝试找到一个没有被广泛讨论的简单问题的最佳解决方案。

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

想想爱丽丝,她有一家餐厅 A,有一个菜单 MenuA,而鲍勃有一家餐厅 B,有一个菜单 MenuB。

我有用于 CRUD 餐厅和菜单的 API,并且我可以轻松地仅向具有正确声明和角色的登录用户授权。我现在想做的是阻止鲍勃访问爱丽丝的餐厅或菜单,反之亦然。 例如,鲍勃应该被授权PUT /api/restaurants/B但应未经授权PUT /api/restaurants/A甚至PUT /api/restaurants/A/menus/x

这里提供了一种可能的解决方案ASP.NET MVC 属性仅允许用户编辑他/她自己的内容 https://stackoverflow.com/questions/11037213/asp-net-mvc-attribute-to-only-let-user-edit-his-her-own-content。此解决方案需要创建自定义授权属性来主动检查登录用户是否是所访问实体的专有。这些实体有一个 userId 字段来检查发出请求的用户是否是数据的所有者。 这个解决方案很好很干净,但缺乏一些功能。 模型中的每个实体都应该有一个 userId 字段,并且只能由所有者访问,或者对于每个实体,我需要导航到授权模型的根实体(例如,访问菜单,我需要查询父实体 Restaurant 来检查如果 MenuB 位于用户拥有的餐厅内)。 要实现多个所有者(例如餐厅经理),逻辑将复杂得多。我还担心这里的开销,因为基本上每个调用都需要执行一些查询来检查数据访问,但这可能不是问题。

有最佳实践吗?


您想要做的是实施基于属性的访问控制或abac /questions/tagged/abac.

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

以下架构总结了流程。

PDP 配置有一组策略,用于确定允许什么和拒绝什么。例如,您可以编写如下策略:

  • 餐厅老板可以查看餐厅页面
  • 餐厅老板可以编辑该餐厅的菜单。
  • 顾客可以查看任何公开餐厅的菜单。

您可以使用两种语言编写策略:xacml /questions/tagged/xacml or alfa /questions/tagged/alfa.

例如,在 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
        }
    }
}

您所需要的只是使用 XACML 3.0 策略决策点。有 Java 和 .NET 实现以及商业实现。看看这个关于 .Net 授权的博客文章 https://www.axiomatics.com/blog/entry/custom-claims-based-authorization-in-net-using-axiomatics-pep-sdk-for-net.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何防止用户使用 dotnet core 和 RESTful API 访问其他用户的数据? 的相关文章

  • 使用 ITextsharp 将 Html 导出为 PDF

    我已经尝试了下面的代码 我也遇到了错误 我正在使用最新的 DLL String strSelectUserListBuilder h1 My First Heading h1 p My first paragraph p String ht
  • IB Java API:提取多个合约的股票数据(实时柱)

    我正在对算法交易和 IB API 进行一些自学和实验 我决定使用 Java 但我愿意切换到 C 我浏览了一个在线教程 该教程将引导您完成下面所示的代码 但我想知道是否可以将其扩展到一只股票之外 我想浏览所有 SP500 股票并检查股票数据
  • log4net 仅在调用 XmlConfigurator.Configure() 时起作用

    我明白那个this https stackoverflow com questions 445976 log4net config in external file does not work 1479343 1479343 questio
  • 使用 F5 时,finally 似乎没有在 C# 控制台应用程序中执行

    int i 0 try int j 10 i catch IOException e finally Console WriteLine In finally Console ReadLine 在VS2008中按F5时 finally块似乎
  • Swagger 生成 javascript-closure-angular-client

    我是 swagger 的新手 我从 swagger 的在线编辑器生成了一个 javascript 闭包角度客户端 它给了我一个 DefaultAPI js 和其他与我的对象定义匹配的 JS 文件 我在 swagger 文档和网上搜索了一种在
  • 为什么自定义类型变量不保存值MVC

    我正在尝试使用 MVC 5 构建一个网站 我有一个包含 3 个变量的控制器类 public class WorkerController Controller public ViewModel viewModel new ViewModel
  • 如何查找局域网中所有主机上正在运行的程序的所有实例?

    出于实际目的 SqlDataSourceEnumerator 的作用是查找在 LAN 上的各个 PC 上运行的 SQL Server 的所有实例 是否有等效的方法可以查找任意应用程序的运行实例 编辑 好的 所以这只有效 因为这些应用程序有预
  • Spring.NET 和构造函数拦截器

    我正在尝试在构造时对对象进行一些 AOP 并找到了 IConstructorInterceptor 这对于我想要的东西来说是完美的 但它似乎不起作用 http jira springframework org browse SPRNET 2
  • C# .Net Serial DataReceived 事件响应对于高速数据来说太慢

    我已经设置了一个 SerialDataReceivedEventHandler 并在 VS2008 Express 中使用基于表单的程序 我的串口设置如下 115200 8N1 Dtr 和 Rts 已启用 接收字节阈值 1 我有一个通过蓝牙
  • 如何在 Google 知识图谱中搜索具有特定属性的条目?

    应如何制定搜索查询kgsearch googleapis com查找给定类别中的所有条目 例如 如果我想搜索 Schema org 类别中的内容应用类别 http schema org applicationCategory 我该怎么办呢
  • 如何将智能感知添加到我的应用程序中?

    我们的一款产品拥有一种专有的宏语言 通过我们的 Windows 软件进行编辑 我想添加智能感知 但我不知道如何去做 至少不完全重新发明轮子 是否有任何示例代码或第 3 方包至少可以让我开始 它不一定是免费的 该应用程序使用 NET 用 C
  • 在 DataGridView 中隐藏行非常慢

    我在 Winforms 应用程序中有一个 DataGridView 大约有 1000 行 未绑定 和 50 列 隐藏一列需要整整 2 秒 当我想隐藏大约一半的行时 这就成为一个问题 private void ShowRows string
  • StreamReader,C#,peek

    我有一个 StreamReader 它偶尔会检查它是否有更多内容可以从简单的文本文件中读取 它使用 peek 属性 问题是 当我使用 peek 时 位置发生了变化 尽管不应该发生 FileStream m fsReader new File
  • C# Julian 日期解析器

    我在电子表格中有一个单元格 它是 Excel 中的日期对象 但当它来自 C1 的 xls 类时 它会变成双精度型 类似于 2009 年 1 月 7 日的 39820 0 我读到这是儒略日期格式 有人可以告诉我如何在 C 中将其解析回 Dat
  • EasyNetQ 模型关闭

    我使用 EasyNetQ 实现了一个简单的 RabbitMQ 客户端 连接后 我收到一条通知 队列模型关闭 这是我的代码 var bus RabbitHutch CreateBus String Format host 0 hostName
  • 托管 .NET 代码中的“访问冲突写入位置...”

    我收到以下异常 MqSearch exe 中 0x000007FE21AFE593 mscorlib ni dll 处出现未处理的异常 0xC0000005 写入位置 0x00000006609476FD 时出现访问冲突 代码是完全托管的
  • 在 .Net 托管的 IronPython 脚本中设置和获取变量

    我正在尝试使用 Net 控制台应用程序中托管的 IronPython 来构建验证规则引擎的原型 我已经将脚本精简到我认为的基础内容 var engine Python CreateEngine engine Execute from Sys
  • 同一服务器上的多个.NET版本

    所以我一直都知道在一台计算机 客户端或服务器 上运行多个版本的 NET 框架是可以的 这个问题 https stackoverflow com questions 407306 running many versions of net on
  • CompileAssemblyFromDom 抛出访问被拒绝异常

    代码 using var codeProvider new CSharpCodeProvider var compilerParameter new CompilerParameters assemblies assemblyName fa
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字

随机推荐

  • 如何在 JLabel 中获取带有颜色的表情符号

    我想用 Java 处理包含表情符号的字符串 如下所示 当我把这个字符串放入 JLabel 中时 图形结果是这样的 我怎样才能使它看起来像 JLabel 中的第一个 谢谢 表情符号只是 unicode 字符 由字体指定一个字形来表示该字符 所
  • laravel 5.4 :Laravelcollective/html v5.3.0 需要照亮/视图 5.3。*

    我正在使用Laravelcollective html v5 3 0 with laravel 5 3 现在我正在使用laravel 5 4 我有正在使用的表格Laravelcollective html v5 3 0 The compos
  • 如何在 ReactJs 中使用轮选择器创建循环

    我正在尝试以这种方式循环工作日 周日 周一 周二 周三 周四 周五 周六 周日 周一 周二 就像水平圆圈一样 为此我正在使用这个回购协议 https www npmjs com package vseslav react native ho
  • 在 C# 中检查 double 是否为整数的好方法是什么? [复制]

    这个问题在这里已经有答案了 可能的重复 如何判断小数 双精度数是否为整数 https stackoverflow com questions 2751593 how to determine if a decimal double is a
  • 当 body 高度: 100% 无绝对 pos 时垂直居中 div

    我有这个来填充窗口 html body height 100 然后容器也设置为 height 100 如何在不指定和设置高度 以像素为单位 的情况下将 div 与图像垂直居中without使用绝对定位 使用padding top 50 底部
  • SKVideoNode 作为 SCNSphere 的纹理

    我正在尝试使用 SKVideoNode 作为 SCNView 中 SCNSphere 的视频纹理源 我正在关注这个答案 SKVideoNode 嵌入在 SKScene 中 作为场景套件节点的纹理不起作用 https stackoverflo
  • 错误:功能未正确部署

    功能部署有错误 要继续部署其他功能 例如数据库 请运行 firebase deploy except functions Error 功能未正确部署 尝试运行部署 debug 例如 firebase debug deploy 就我而言 该函
  • 如何从 Angular 属性指令中访问元素 HTML?

    Angular 文档提供了一个创建更改元素背景颜色的属性指令的示例 https angular io docs ts latest guide attribute directives html https angular io docs
  • doLayout 和包含在“Java Play!”模板中的区别是什么?

    When 延伸 with doLayout你只能有一个子模板 但是你可以include超过一个 有什么区别 最佳实践是什么 它们是彼此相反的 doLayout被用作extends标签 extends 标签指定您想要扩展哪个模板 以及doLa
  • xlswrite 如果是向量

    我有一个 mat 文件 其中包含titles time data 和 2 个列向量 time 1 2 3 4 5 and data 10 20 30 40 50 我创建了一个名为 table time data time data 的新单元
  • 如何在 Ruby 中使用 selenium-webdriver/capybara 截取完整浏览器页面及其元素的屏幕截图?

    我正在研究屏幕截图自动化 特别是 我正在努力实现以下目标 提示用户提供网站不同页面的链接 X 提示用户输入类名 Y 我应该能够访问网站 X 登录页面 提供登录详细信息 假设它们已知 单击 提交 按钮 这应该将我重定向到 主页 页面 然后 我
  • AppHarbor可以在构建过程中设置条件编译符号吗?

    AppHarbor可以在构建过程中设置条件编译符号吗 也许很简单 AppHarbor 我有一些测试无法在服务器上运行 它们依赖于测试数据文件 如果 AppHarbor 可以设置条件编译符号 那么当该符号存在时 我可以在测试中添加 Ignor
  • 带自定义滚动条的 Jquery 选项卡式导航

    请参阅新的 更新的问题 https stackoverflow com questions 7423874 jquery navigation and jscrollpane work at first but not after clic
  • 使时间序列在轴上显示最后一个日期?

    所以在 Chart js 中我有一个基于日期范围的时间序列 该图表无法将所有日期显示为轴标签 因此它显示了合理的选择 它始终在左侧显示第一个日期 但并不总是在轴的右端显示最后一个日期 例如 我的日期范围可以是从 1 月 1 日到 7 月 3
  • Java 支持柯里化吗?

    我想知道是否有任何方法可以在 Java 中实现这一点 我认为如果没有对闭包的原生支持 这是不可能的 Java 8 2014 年 3 月 18 日发布 确实支持柯里化 示例 Java 代码发布于Missingfaktor 的回答 https
  • 如何收集任何 java 进程的堆转储

    我是 Heaps 新手 谁能建议我如何获取任何 java 进程 如 Jmeter 的堆转储 我读到了有关 jmap 命令的内容 但我不知道在哪里以及如何执行 编写它 在 Eclipse 或 cmd 中 这可能是一个非常基本的问题 但仍然需要
  • cv::findContours 返回的轮廓是否具有一致的方向?

    我正在使用 OpenCVcv findContours http docs opencv org 2 4 modules imgproc doc structural analysis and shape descriptors html
  • 登录时 BjyAuthorize 未检测到角色

    我正在使用 ZF2 Doctrine ORM 和 BjyAuthorize 问题是 当我登录时 身份的 getRoles 方法返回空 class User implements UserInterface ProviderInterface
  • Oracle - select 语句中的动态列名

    问题 是否可以根据结果集中的值更改 select 语句中的列名称 例如 如果一个year结果集中的值小于1950 为列命名OldYear 否则命名该列NewYear The year结果集中的值保证所有记录都相同 我认为这是不可能的 但这是
  • 如何防止用户使用 dotnet core 和 RESTful API 访问其他用户的数据?

    我正在尝试找到一个没有被广泛讨论的简单问题的最佳解决方案 我的应用程序有很多可以创建和编辑数据的用户 用户应该只查看和编辑他的数据 而不是其他人的数据 想想爱丽丝 她有一家餐厅 A 有一个菜单 MenuA 而鲍勃有一家餐厅 B 有一个菜单