c# - 实现行级安全性——(SP 与 LINQ to Objects)

标签 c# security .net-3.5 linq-to-objects row-level-security

我认为这更像是一个关于最佳实践和设计的问题,而不是其他任何问题。我尝试搜索与此相关的类似查询,但没有找到。我实际上找到了 Row Level Security with Entity Framework但我相信这里的上下文有点不同。

我将首先尝试解释我的场景:

我有一个 .net 3.5 网站,它使用通用的业务库通过 NHibernate 访问我的 SQL 2008 数据库。所有代码都是 C#,带有 NHibernate 2.1。 我的网站显示来自业务库的不同 IList 的负载,业务层通过 NHibernate 从 SQL 获取所有数据。所以,例如,我可以有一个返回 IList 的方法,另一个返回 IList 的方法,另一个 IList,等等…… 关键是事件用户只能访问所有返回的一部分(几乎所有类型的结果集都必须从安全性中过滤),所以我需要在库上实现一个“数据过滤器”,它只返回允许的数据行到网站。为了实现这一点,图书馆使用了我网站上的 IPrincipal,这样我就可以获得用户详细信息来过滤数据,但是由于我们的安全模型非常复杂,因此将其散布到我们所有的方法中会产生巨大的维护问题。 因此,为了解决这个问题,我们创建了几个 SQL SP,它们返回当前用户允许的项目,在业务逻辑上,我们只需要将请求的数据与安全数据结合起来,我们就有了要发送给用户的最终结果集。 现在这个加入数据的过程正在使用 Linq to Objects,我在其中加入一个带有列表(安全)的 iList 以仅返回允许的结果集。 IList 它以不同的方式来自 NHibernate,可以是 GetAll() 方法、ICriteria.List() 或 IQuery.List() 甚至是 NamedQuery.List(),并且安全数据总是来自其中之一两个 NamedQuery.List()。我还计划实现线程以允许同时进行 SQL 调用,并在 thread.join() 之后在两个 IList 上执行 LINQ 连接。 我在下面添加了示例代码来说明需要如何执行方法。

第二个选项,也是我们试图摆脱的是在 SQL 端实现连接,让我们所有的调用都必须来自 SQL SP,它们将在安全结果上进行连接,并且不允许业务完整使用 NHibernate 功能的代码。

public IList<Product> GetAllByName(string FirstLetter) {
    ICriteria GetAllCriteria = this.session.GetISession().CreateCriteria(typeof(Product));
    GetAllCriteria.Add(NHibernate.Criterion.Restrictions.Like("ProductName", FirstLetter));
    GetAllCriteria.AddOrder(NHibernate.Criterion.Order.Asc("ProductName"));

    // Here would go the Threading for the both calls
    IList<Guid> AllowedItems = SecurityBase.GetAllowedItemsForCurrentUser();
    IList<Product> AllProducts = GetAllCriteria.List<Product>();

    var ResultSet = from Prod in AllProducts
                    join Sec in AllowedItems on Prod.Id equals Sec
                    select Prod;

    return ResultSet.ToList<Product>();
}

现在我的问题是,对于行级安全来说,这是一种糟糕的方法/做法吗(请记住,我们的安全模型确实很复杂且可定制——这是由业务设计决定的),还是我们正在朝着正确的方向前进?我们还有其他选择吗?

提前致谢, 克莱顿

最佳答案

我目前正在从事具有类似要求的项目。这是一个未开发的项目,尚未编写代码,我们只是在寻找基于行的安全性的解决方案。

我会向您推荐这两篇文章:

http://www.codeproject.com/KB/database/Modeling_DAGs_on_SQL_DBs.aspx http://www.codeproject.com/KB/database/AFCAS.aspx

关于您的线程想法,使用 System.Threading 会给您带来麻烦,看看 Ritcher 的 AsyncEnumerator 或 Microsoft Concurrency runtime (CCR)

关于c# - 实现行级安全性——(SP 与 LINQ to Objects),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1571703/

相关文章:

c# - 如何使用c#移动到word中的下一部分

c# - 如何在 aspx 页面的服务器脚本 block 中使用 [WebMethod]?

C# 将函数作为参数传递

c# - Linq 扩展方法和错误处理

database - SSDT : how to protect the password contained in the publish profile?

security - GlassFish 管理控制台(端口 4848)安全吗?

sql-server - 授予数百个 SP 的访问权限?

c# - 调试使用来自 Vista API 的 FileDialog 的 Visual Studio 2010 解决方案的问题

.net - .NET 中的稀疏多维数组或矩阵库

c# - 从 C++ 到 C# 的函数指针转换