• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

确保从多租户SPA访问DocumentDB

security 来源:Alexander Zhidkov 5次浏览

我们正在开发使用Azure DocumentDb作为存储的多租户Angular Web App。来自应用程序所有租户的文档存储在同一个集合中,并由文档的tenantId属性进行区分。我们将拥有中间层.NET服务,该服务持有DocumentDb的主密钥并公开REST API端点以便通过Web App进行CRUD操作。 Web App的用户通过oAuth提供商(Google,Facebook,Microsoft)进行身份验证。确保租户数据的最佳做法是什么,以便一个租户的用户无法访问其他租户的数据?确保从多租户SPA访问DocumentDB


===========解决方案如下:

我没有足够的信心把它最好的做法,但我们有一个中间层REST API像你一样,在这里我们做什么:

  1. 客户端(甚至浏览器代码)可以提交任意查询。我们使用sql-from-mongo,所以这些语言都是类似于mongo的语法,这对于javascript客户端来说更容易构建查询,但是我建议使用原始SQL查询的安全性一样安全,只要您将变量参数化并且禁止您的SELECT条款中的任何投影。这是我们在sql-from-mongo翻译中完成的最后一部分,但是您可以删除预测(将提供的SELECT子句替换为SELECT *),或拒绝任何不以SELECT *开头的查询。这是非常重要的,因为如果没有它,不好的演员可以投射他们自己的tenentIDuserID,这些控制的其余部分不起作用。

  2. 我们的REST中间件为每个客户端缓存租户和用户上下文,这些包含我们的授权规范(类似于Firebase的概念)。用最简单的形式,用户绑定到单个帐户,并且该用户已读取该租户的所有数据的权限,但您可以指定任何内容。

  3. 执行查询时,将根据授权规范检查返回的数据集。根据具体情况,任何数量的禁止文档的请求都会被完全拒绝,或者不允许的文档会从我们返回的结果集中过滤掉。

  4. 在写事物的方面,我们做了类似的事情。我们根据授权规范检查更新并拒绝任何不符合规定的更新。这比这更复杂一点,因为我们在所有写入中使用sproc,并且我们为就地更新使用类似mongo的语法,并且我们为所有写入(使用sproc)实现了跨文档ACID,但是您可以执行我没有这些建议。

希望这会有所帮助。随意在评论中提问。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)