AD组的实体框架和行级安全性

时间:2016-03-22 16:47:39

标签: c# sql-server entity-framework

我目前正在开展一个我们希望实现以下目标的项目:

假设我们有一个名为products的表:

[Id] [Title] [Description] [AccessRights]

现在我们要做的是创建一个返回IQueryable的方法,该方法仅在特定用户(输入参数)位于AccessRights列下的组中时公开该表的数据。

因此,假设我们有一个用户Devedse和一个用户TestMan。用户Devedse在“PowerUsers”组中。用户TestMan不在哪里。我们想要为用户TestMan请求所有产品,我们不应该使用AccessRight'PowerUsers'获得任何产品。

现在我们可以在C#中实现这一点,但我们宁愿使用SQL中的函数来实现它,因此我们不必在确定用户可以访问哪些行之前先检索所有数据。

这样的事情:

public IQueryable GetProducts(string user)
{
    return dbContext.Products.ExecuteStoredProcedure(user);
}

我们目前在函数中使用IS_MEMBER()函数实现了这个功能,然后通过视图公开。遗憾的是,这不支持输入(View也不支持输入参数)。 IS_MEMBER函数将简单地检查当前用户是否是该组的成员,因此要求我们使用模拟或EXECUTE AS。 (然后要求所有域用户基本上都对数据库具有读访问权限。我宁愿不做的事情。)

有谁知道我们如何才能实现这一目标?

编辑:我们公开的IQueryable仍然可以与其他查询一起使用也很重要。 (LINQ通常会为IQueryable上的LINQ查询执行处理,以便最终的SQL查询在处理之前不必首先获取所有数据。)

Edit2:想一想,最理想的情况是EntityFramework会产生某种类似的SQL:

select * from Products WHERE @param1.IsMemberOf(AccessRights)

我不确定这是否可行?

0 个答案:

没有答案