Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实现行级安全性–;(SPs与LINQ到对象)_C#_Security_.net 3.5_Linq To Objects_Row Level Security - Fatal编程技术网

C# 实现行级安全性–;(SPs与LINQ到对象)

C# 实现行级安全性–;(SPs与LINQ到对象),c#,security,.net-3.5,linq-to-objects,row-level-security,C#,Security,.net 3.5,Linq To Objects,Row Level Security,我相信这更多的是关于最佳实践和设计的问题,而不是其他任何问题。我试图搜索与此相关的类似查询,但找不到任何查询。事实上,我找到了答案,但我相信这里的上下文有点不同 我将首先尝试解释我的场景: 我有一个.NET3.5网站,它使用公共业务库通过NHibernate访问我的SQL 2008数据库。所有代码都是C#,带有NHibernate 2.1。 我的网站显示了大量来自业务库的不同IList,业务层通过NHibernate从SQL获取所有数据。因此,例如,我可以有一个方法返回IList,另一个方法返回

我相信这更多的是关于最佳实践和设计的问题,而不是其他任何问题。我试图搜索与此相关的类似查询,但找不到任何查询。事实上,我找到了答案,但我相信这里的上下文有点不同

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

我有一个.NET3.5网站,它使用公共业务库通过NHibernate访问我的SQL 2008数据库。所有代码都是C#,带有NHibernate 2.1。 我的网站显示了大量来自业务库的不同IList,业务层通过NHibernate从SQL获取所有数据。因此,例如,我可以有一个方法返回IList,另一个方法返回IList,另一个IList,等等… 关键是,活动用户将只能访问所有返回的一部分(几乎所有类型的结果集都必须从安全性中过滤),因此我需要在库上实现一个“数据过滤器”,只将允许的数据行返回到网站。为了实现这一点,图书馆使用了我网站上的IPrincipal,因此我可以获得用户详细信息以过滤数据,但由于我们的安全模型非常复杂,将其扩展到所有方法将产生巨大的维护问题。 因此,为了解决这个问题,我们创建了两个SQL SP,它们为当前用户返回允许的项,在业务逻辑上,我们只需要将请求的数据与安全数据连接起来,我们就可以将最终结果集发送给用户。 现在,这个连接数据的过程正在使用Linq to对象,我在其中使用列表(安全性)连接iList,以仅返回允许的结果集。 IList以不同的方式来自NHibernate,可以是GetAll()方法、ICriteria.List()或IQuery.List()甚至NamedQuery.List(),安全数据总是来自两个NamedQuery.List()中的一个。我还计划实现线程化,以允许同时调用SQL和线程后调用。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>();
}
public IList GetAllByName(字符串首字母){
ICriteria GetAllCriteria=this.session.GetISession().CreateCriteria(typeof(Product));
添加(NHibernate.criteria.Restrictions.Like(“ProductName”,FirstLetter));
GetAllCriteria.AddOrder(NHibernate.criteria.Order.Asc(“ProductName”));
//这将是两个调用的线程
IList AllowedItems=SecurityBase.GetAllowedItemsForCurrentUser();
IList AllProducts=GetAllCriteria.List();
var ResultSet=来自所有产品中的产品
在产品Id上的AllowedItems中加入秒等于秒
选择Prod;
返回ResultSet.ToList();
}
现在我的问题是,对于行级安全性来说,这是一种糟糕的方法/实践(请记住,我们的安全模型非常复杂且可定制——这是由业务设计决定的),还是我们朝着正确的方向前进?我们还有别的选择吗

提前感谢,,
Claiton作为一个选项,您是否考虑过,与使用SQL SP返回允许项列表不同,您在视图内部使用相同的逻辑/连接,只查询视图/只提供对视图的权限,而不是对基础表的权限。

我目前正在处理一个具有类似要求的项目。这是一个绿色领域的项目,尚未编写任何代码,我们只是在寻找一种基于行的安全性解决方案

我向您推荐这两篇文章:


关于您的线程化想法,使用System.threading会让您感到悲伤,请看一看Ritcher的AsyncEnumerator或Microsoft并发运行时(CCR)

我知道这有点晚了,但您是否已经看了以下内容:


这是一个开源项目,我是该项目的首席开发人员,无缝地实现了行级安全。

您好,感谢您的回复。是的,这是一个很好的选择,但是我的应用程序用户不是DB用户,因此我需要以某种方式将我的用户ID发送到视图,并且不能使用通用的NHibernate函数。我的问题不在于对数据库的访问,而在于对应用程序本身的访问。无论如何,我正在实现一个测试应用程序,看看是否可以以某种方式在应用程序上设置此选项。再次感谢。归结到SecurityBase.GetAllowedItemsForCurrentUser是如何获得列表的/其背后的逻辑是什么,即是否可以在视图中轻松地对其进行编排而不需要联合ID。