我正在一个基于实体框架的应用程序中隔离商店数据到共享数据库。我想使用SQL Server 2016的行级安全性,但是我更喜欢让我的数据库连接都使用单个用户。所以我想将SQL Server的CONTEXT_INFO设置为所有实体框架查询的商店号码。然后行级安全性就可以确定行是否属于CONTEXT_INFO所设定的商店号码。
我想完成这个任务唯一的想法是更新我的DbContext构造函数来创建一个连接,执行SET CONTEXT_INFO语句,然后将连接传递给基本构造函数。我认为我可以添加一个构造函数重载在我的DbContext的部分类中来完成这个任务或修改t4模板以生成原始构造函数。
EF提供了更好的方法吗?我正在使用DB first。
我想完成这个任务唯一的想法是更新我的DbContext构造函数来创建一个连接,执行SET CONTEXT_INFO语句,然后将连接传递给基本构造函数。我认为我可以添加一个构造函数重载在我的DbContext的部分类中来完成这个任务或修改t4模板以生成原始构造函数。
EF提供了更好的方法吗?我正在使用DB first。
SESSION_CONTEXT
是更优秀的,因为它可以保存多个值(避免与其他应用程序冲突),存储变体(比原始字节的CONTEXT_INFO进行更安全的转换),并且允许在第一次调用后将值设置为只读(增加安全性)。问题仍然存在(在连接打开后执行sp_set_session_context)。 - Jeroen MostertSESSION_CONTEXT
允许通过唯一键设置值,CONTEXT_INFO
是一个二进制块,只能作为整体设置。您只能将CONTEXT_INFO
用于一个目的,并且所有代码必须同意;如果新代码/触发器设置了CONTEXT_INFO
,则会被覆盖。如果您的代码是CONTEXT_INFO
的唯一用户,则没有问题,但是使用SESSION_CONTEXT
可以避免任何冲突(因为您始终可以使键唯一)。 - Jeroen Mostert