【问题标题】:Entity Framework Core Row Level Security using SESSION_CONTEXT使用 SESSION_CONTEXT 的实体框架核心行级安全性
【发布时间】:2016-08-12 03:21:03
【问题描述】:

我正在使用 ASP.NET Core 和 Entity Framework 7 (Core) 编写使用行级安全性的多租户应用程序。 由于我的数据库托管在 Microsoft SQL Server 上,因此我使用了this 方法来强制执行 RLS。

现在我只需要在 SESSION_CONTEXT 中设置所需的tenant_id。

我遇到的第一个问题是使用 EF7 运行存储过程。一个解决方案似乎是:

var resp = context.Set<SessionVars>().FromSql(
          "EXECUTE sp_set_session_context @key = N'my_tenant', @value = {0};
           SELECT * FROM mySessionVars", desiredTenant).ToList();

使用上面的命令我可以清楚的看到SESSION_CONTEXT设置成功了。现在我希望看到根据我在 SESSION_CONTEXT 中设置的租户过滤同一上下文中的下一个查询。

int visibleRows = context.MyModel.ToList().Count;

很遗憾,结果不如预期。它的行为就像在设置 SESSION_CONTEXT 之前检索到的行一样。

这是由 EF7 的 Eager Loading 引起的吗? EF7 是否使用兑现数据? 我该如何克服呢?

我希望能够为 SESSION_CONTEXT 设置任何我想要的值,并将其保留在上下文中,直到更改或连接关闭。

【问题讨论】:

  • 一些博客展示了一种不同的方法,craigpickles.com/… 不确定这是否有用。但我想我会分享。
  • 从 Entity Framework Core 2.0 开始,全局查询过滤器是行级安全性的更好解决方案,而不是使用数据库。 gunnarpeipman.com/2017/08/ef-core-global-query-filters
  • @Greg0 查询过滤器是不错的功能,但我更喜欢注入会话上下文,以便服务器验证租约。

标签: c# asp.net entity-framework


【解决方案1】:

通过阅读this article,我能够找到答案,

EF6 及以后的版本我们采取的方法是,如果调用 代码选择通过调用打开连接 context.Database.Connection.Open() 那么它有充分的理由这样做 所以框架会假设它想要控制打开 并关闭连接,将不再关闭连接 自动。

解决方法是在执行任何 EF 命令之前打开连接。

context.Database.Connection.Open();

【讨论】:

  • 效果如何?我也想做同样的事情。
  • 或者先注入你的上下文,然后从客户端检索你的会话变量?
猜你喜欢
  • 2010-09-15
  • 1970-01-01
  • 2017-04-14
  • 2017-12-23
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多