C# 具有实体框架的行级安全性 我一直在考虑如何用实体框架实现行级安全性。其想法是使用一种与数据库无关的方法,提供方法来限制来自ObjectContext的行

C# 具有实体框架的行级安全性 我一直在考虑如何用实体框架实现行级安全性。其想法是使用一种与数据库无关的方法,提供方法来限制来自ObjectContext的行,c#,database,security,entity-framework,row-level-security,C#,Database,Security,Entity Framework,Row Level Security,我最初的一些想法涉及修改EDMGEN工具创建的部分类,这提供了一些有限的支持。用户仍然可以通过使用自己的eSQL语句和QueryObject绕过此解决方案 我一直在寻找一个全面的解决方案,它将存在于数据库提供者之上,因此它将保持不可知状态。添加安全性的位置实际上取决于您试图保护的对象 例如,如果您正在保护一个网站,那么在上下文级别添加过滤就足够了,因为在本例中“用户”位于该网站上。他们别无选择,只能浏览您的上下文,因为您将完全根据上下文编写应用程序 在您的情况下,您试图保护的“用户”听起来像是开

我最初的一些想法涉及修改EDMGEN工具创建的部分类,这提供了一些有限的支持。用户仍然可以通过使用自己的eSQL语句和QueryObject绕过此解决方案


我一直在寻找一个全面的解决方案,它将存在于数据库提供者之上,因此它将保持不可知状态。

添加安全性的位置实际上取决于您试图保护的对象

例如,如果您正在保护一个网站,那么在上下文级别添加过滤就足够了,因为在本例中“用户”位于该网站上。他们别无选择,只能浏览您的上下文,因为您将完全根据上下文编写应用程序


在您的情况下,您试图保护的“用户”听起来像是开发人员。这要困难得多。如果开发人员没有权限修改数据库本身,那么您必须将安全性放在数据库级别。再多的eSQL访问也无法绕过数据库说“不”。

根据定义,您试图实现的目标是不可能的

如果底层数据库应用程序(SQLServer、Oracle等)没有显式处理安全性,那么像SQLServerManagementStudio这样的标准工具将彻底失效


您所能做的最好的事情是,仅当应用程序的用户没有通过其他机制访问数据库的权限时,应用程序的用户才强制执行行级别的安全性。

确实可以这样做。要做的重要事情是阻止对对象上下文的直接访问(防止用户构建自己的ObjectQuery),而是为客户端提供一个更窄的网关,在其中访问和修改实体。我们用最简单的方法来做。你可以找到一个。同样,关键是阻止对对象上下文的访问。请注意,对象上下文类是局部的。因此,您应该能够防止以“未经授权”的方式实例化它,即在存储库程序集之外

然而,有一些微妙之处需要考虑。如果通过存储库模式在特定实体类型上实现行级视图安全性,则必须考虑客户端可以访问同一实体的其他方式。例如,通过导航关系。您可能需要将其中一些关系设置为私有关系,这可以在您的模型中实现。您还可以选择或存储过程来加载/保存实体。存储过程往往是特定于DB服务器的,但SQL可以以通用方式编写


虽然我不同意实体框架不能实现这一点,但我同意“在DB服务器上实现”的意见,因为您应该实现。

您可能会发现本文很有用:


“拒绝对实体框架的表访问而不引起哗变”

我找到了一种使用Postgres和一个名为。它实际上(设计用于)使用
视图执行所有操作(选择、更新、删除、插入)并验证
WHERE
子句中的权限。但Veil只是增加了有效管理内存中权限信息的数学运算,而不是每次都查询权限信息。因此,使用Veil,尽管您直接连接到DBMS,但您只获得了为您授予的行级访问权限

我在某些方面修改了我的风格,例如,我开始使用
触发器
而不是
视图
来应用权限限制

我建议您研究这个解决方案,并尝试在这里应用它的逻辑


i、 例如:您进行一个
select*from table
查询,就得到了您想要的结果(从行级别来说)。

请注意,SQL Azure和SQL Server 2016现在已经内置了行级别的安全性,可以与实体框架一起使用。这里有一个教程