ASp.NET MVC EF4 SQL表或字段级安全性

ASp.NET MVC EF4 SQL表或字段级安全性,sql,security,asp.net-mvc-2,entity-framework-4,Sql,Security,Asp.net Mvc 2,Entity Framework 4,我有一个稍微不寻常的安全需求,我正在寻找关于最佳实践的建议,或者至少是非脆弱的方法 场景:内部网系统。关于一些相关实体的数据将被视为私有数据。这称为系统的未发布部分。只有某些用户才能访问此数据。在某些阶段,用户从这些数据中进行选择,标记一些记录并将其发布到“已发布”端。发布到发布侧的数据将从未发布侧删除。然后,大部分系统用户可以在发布端处理记录 我知道这听起来像是父记录上的bool字段,标记为已发布或未发布,但让我解释一下我们正在替换的系统如何解决这个问题-这是我们需要模拟的安全级别。它是一个平

我有一个稍微不寻常的安全需求,我正在寻找关于最佳实践的建议,或者至少是非脆弱的方法

场景:内部网系统。关于一些相关实体的数据将被视为私有数据。这称为系统的未发布部分。只有某些用户才能访问此数据。在某些阶段,用户从这些数据中进行选择,标记一些记录并将其发布到“已发布”端。发布到发布侧的数据将从未发布侧删除。然后,大部分系统用户可以在发布端处理记录

我知道这听起来像是父记录上的bool字段,标记为已发布或未发布,但让我解释一下我们正在替换的系统如何解决这个问题-这是我们需要模拟的安全级别。它是一个平面文件数据库(Dataflex),未发布和已发布的数据位于单独的表中,位于单独的服务器驱动器上,备份到单独的磁带上,位于不同的房间,由不同的人进行物理访问。网络权限确保已发布的用户无法获取未发布的数据。该软件还管理权限,但如果出现错误,或者程序员出错,他们仍然无法访问错误的数据。有可能提出此数据的系统管理员已获得经审核的安全许可

所以我想要的是关于如何用MVC、EF4和SQL实现架构的建议。在一个极端情况下,我构建了两个具有两个sql数据库、不同权限的系统:可能与web.config中包含的差异有关,因此它实际上是相同的代码库。在标尺的另一端,它在表中使用标记为拒绝访问的控制器方法的标志。(这是不好的,因为如果一个程序员搞砸了,比如说一个搜索查询,它返回的数据来自错误的类别,并且它在不被注意的情况下离开了大楼,很可能会导致人类牺牲,狗和猫住在一起……集体歇斯底里)


抱歉,描述太长了。寻求关于如何访问此文件的最佳实践或其他建议。

老实说,我不相信EntityFramework是您正在寻找的ORM。您将需要比它所提供的更多的控制—我想的是能够在连接上设置审核信息,以便您知道用户是谁,预访问运行登录触发器,然后您可能需要截取关系和实体并执行代码安全性的代码。如果您喜欢使用ORM,请阅读以下内容:

如果信息像你所说的那样重要或保密,那么就必须实施数据库安全,只有应用级安全是不够的(深入思考防御)

假设您正在部署一个Web服务器和一个应用程序服务器,并用wcf将两者连接起来,因此问题不应该是MVC将要做什么,而是MVC、wcf和您选择的ORM(如果有的话)将如何交互


另一种方法,prehaps,是在sql server中使用可更新的视图来屏蔽未发布的数据。

不是MVC/EF特定的答案,但有一篇较旧的Technet论文(针对sql server 2005)回答了许多问题,可能很有用:

“使用SQL Server 2005在分类数据库中实现行级和单元级安全”


。同样的论文也可以。

如果所有实体都为其核心标识字段共享一个公共基类,那么这并不难。只要您的实体都共享一个公共基类,您就可以为该基类创建一个扩展方法,该方法使用实体的密钥和尝试操作的用户的给定id,并且您可以验证它是否在数据访问层的一行中得到授权

public static bool ActionIsAuthorized<T>(this T entity, ActionType actionType, string     actionBy) where T : BaseEntity
{
   bool authorized = false;
    //do your auth lookup here based on which kind of action they are performing. ActionTypes     is an enum
    return authorized;
}

出于好奇,你在哪个行业工作?:)这本书与王室有关,读起来很有趣。我将深入研究Nhibernate。我可能能够推动这一变化:您可以随时了解审计需求、登录触发器等。可更新的视图可能会有所帮助,但这仍然不能提供与用户相关的表级安全性。它不是一个分层部署,没有WCF,尽管也许它应该是!我不打算讨论“我们是如何达到现在的状态”的,但是已经有很多系统在运行,这是一个有趣的想法。系统只有几个用户,因此如果我们避免连接池,就不会有可伸缩性问题。我从未对每个用户使用过一个连接,但我想这只是使用可信连接的一种情况,而且。我会详细读那篇文章的!我将通过模拟使用表级安全性—我已经习惯了连接池,我忘记了这是可能的。
if(!YourEntity.ActionIsAuthorized(ActionType.Update, username))
{
    throw new ActionUnauthorizedException();
}
else
{
    //do data access stuff here
}