【问题标题】:How set session context in SQL for RLS in EF Core如何在 SQL 中为 EF Core 中的 RLS 设置会话上下文
【发布时间】:2021-12-01 01:37:16
【问题描述】:

我们有一个在 .Net Core 3.1 中开发的 web api,它与 Azure SQL db 通信并作为 Azure web 应用程序运行。该数据库是多租户应用程序的单个数据库,受row-level security 保护。它需要在执行任何 SQL 语句之前设置会话上下文。会话上下文是租户表的主键,是一个整数。

我了解到我可以使用EF Core Interceptors 并设置会话上下文。然而,出于安全原因,我们无法在 URL 中发送/接收租户 ID 作为参数,因此我们使用了另一个看起来像加密字符串的标识符。 考虑到我们有一个租户标识符,将会话上下文设置为租户 ID 的最有效方法是什么? API 是无状态的,所以我不能使用会话,控制器不需要身份验证,所以我也没有登录用户。最后一个选项,可能也是最丑陋的方法是在服务器端硬编码和维护一个列表,这样我就不必每次都进行数据库访问。

【问题讨论】:

  • 您的租户表是否包含此标识符?最明显的方法是将它添加到那里并在会话开始时进行查找。额外的往返应该可以忽略不计,因为没有数据必须返回给客户端。如果查找的性能是一个问题,租户表可以在内存中创建(如果它还没有)。
  • @JeroenMostert 是的,标识符在租户表本身中。我没有任何会话,因为 API 是无状态的,这是否意味着在获取租户 ID 后,我应该在每个请求/响应中来回发送它?很高兴知道如果数据不返回客户端,db 行程可以忽略不计。 “在内存中制作表”是指我应该对所需的数据进行硬编码,还是有另一种不需要应用更新的存储方式,例如 Azure Key-Vault?
  • 我的意思是使用memory-optimized table。那里没有硬编码。如果您根本没有会话,那么是的,您必须有 某种 方法来传递租户(并且安全地这样做,这样人们就不会欺骗其他租户的请求)或根据到IP,或其他任何东西。内存表可用于将您拥有的任何内容映射到数据库所需的 ID;这应该足够便宜且足够快,可以处理每个请求。

标签: sql-server asp.net-core entity-framework-core


【解决方案1】:

考虑到来自@JeroenMostert 的 cmets,我决定进行一次数据库之旅,因为它不会很昂贵,因为数据不会返回给客户端。但是在获得一些好的知识和理解之后,我肯定会考虑使用内存优化表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多