【发布时间】: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