使用SESSION_CONTEXT的实体框架核心行级安全性

时间:2016-08-12 03:21:03

标签: c# asp.net entity-framework

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

1 个答案:

答案 0 :(得分:4)

通过阅读this article

,我无法找到答案
  

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

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

context.Database.Connection.Open();