2016-08-12 82 views
4

我正在使用使用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设置任何我想要的值,并将其保留在上下文中,直到更改或连接关闭。

+0

一对夫妇的博客显示了不同的方法,http://craigpickles.com/row-level-security-in-azure-sql-with-entity-framework/不知道这是有益与否。但我以为我会分享。 –

+0

从实体框架核心2.0开始,全局查询过滤器是行级安全性的更好解决方案,而不是使用数据库。 http://gunnarpeipman.com/2017/08/ef-core-global-query-filters/ –

回答

4

我abble通过阅读this article到找到了答案mysels,

EF6和未来的版本中,我们采取的方法是,如果调用 代码选择通过调用 context.Database.Connection打开连接打开(),那么它有一个很好的理由做 所以框架将假定它想要控制打开 并关闭连接,并不再自动关闭连接 。

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

context.Database.Connection.Open(); 
+0

这是怎么回事?我期待着做同样的事情。 –