C# · 12月 30, 2021

c# – 具有实体框架的行级安全性

我一直在试图考虑如何使用实体框架来实现行级安全性.这个想法是使数据库不可知的意思是提供限制来自ObjectContext的行的方法.

我的一些初步想法涉及修改EDMGEN工具创建的部分类,并提供了一些有限的支持.用户仍然可以通过使用自己的esql语句和一个QueryObject来解决这个问题.

我一直在寻找一个全面的解决方案,它将存在于数据库提供者之上,以使它保持不可知性.

解决方法 当然可以做到重要的是要阻止直接访问对象上下文(阻止用户构建自己的ObjectQuery),而是为客户端提供一个较窄的网关来访问和变更实体.我们可以使用 Entity Repository pattern.你可以找到一个 example implementation of this pattern for the entity framework in this blog post.再次,关键是阻止对对象上下文的访问.请注意,对象上下文类是部分的.因此,您应该能够防止“未经授权”的实例化方式,即在存储库组合之外.

但是,有些微妙的考虑.如果您通过存储库模式在某个实体类型上实现行级视图安全性,则必须考虑客户端可以访问相同实体的其他方式.例如,通过导航关系.您可能需要将某些关系私有化,您可以在模型中进行.您还可以选择specifying a custom query或加载/保存实体的存储过程.存储过程往往是DB服务器特定的,但sql可以以通用方式编写.

虽然我不同意这不能与实体框架完成,但我同意“实施DB服务器”的意见,因为您应该实现defense in depth.