我正在使用使用ASP.NET Core和Entity Framework 7(Core)的行级安全性编写多租户应用程序。 由于我的数据库托管在Microsoft SQL Server上,因此我使用this方法来实施RLS。使用SESSION_CONTEXT的实体框架核心行级别安全性
现在我需要的是在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设置之前检索到的行相同。
这是由Eager Loading EF7造成的吗? IS EF7使用兑现数据? 我该如何克服这个问题?
我希望能够为SESSION_CONTEXT设置任何我想要的值,并将其保留在上下文中,直到更改或连接关闭。
一对夫妇的博客显示了不同的方法,http://craigpickles.com/row-level-security-in-azure-sql-with-entity-framework/不知道这是有益与否。但我以为我会分享。 –
从实体框架核心2.0开始,全局查询过滤器是行级安全性的更好解决方案,而不是使用数据库。 http://gunnarpeipman.com/2017/08/ef-core-global-query-filters/ –