小编cro*_*els的帖子

OData WebAPI 2复杂授权

我们有一个Web Api 2 OData v3服务,我们需要实现相当复杂的授权.我们在客户端代码中使用Breeze,当Breeze的OData v4版本发布时,我们将API升级到OData v4,因此解决方案需要能够在两个OData版本上运行.

此图给出了我们正在使用的实体模型的基本视图(抱歉,图像的信誉点不够):

 ServiceCompany
     |   
     |  
    /|\  
Manufacturer
     |   
     |  
    /|\    
    Site
     |   
     |  
    /|\  
  SiteArea  -------
     |            |
     |            |            
    /|\          /|\ 
 Equipment     Instrument
                  |
                  |
                 /|\
               Channel
Run Code Online (Sandbox Code Playgroud)

SiteArea具有"OperatingFunction"属性 - 这表示在此站点区域位置发生制造过程的哪个阶段.

用户可能是

  • 一个人坐在制造商级别并且可以访问他们的所有站点数据
  • 一个人坐在制造商级别并且可以访问他们的SiteAreas的一些但不是全部,因此只能访问他们的SiteArea数据的子部分
  • 坐在ServiceCompany级别的人员可以访问某些制造商,并且只能访问这些制造商中的某些站点,并且可能只是SiteArea的某些OperatingFunction.

对于频道数据会有一个请求,我们需要确保只返回或更新(取决于请求类型)允许个人影响的数据.

在初步调查时,实现它的明显选择似乎是QueryInterceptors和ChangeInterceptors,这意味着我们可以根据请求中发送的声明添加更多过滤器首选项.然而,看起来Query/ChangeInterceptors是Wcf的一部分,而不是WebApi,并且最重要的是它们只是v1-3 Wcf OData实现的一部分,到目前为止OData v4没有任何内容.

当然,我们可以将过滤器代码编写到每个方法中,但实际上这似乎是一种令人讨厌的方式来实现一些本质上是交叉问题的东西.

我们已经查看了EF6拦截器,但得出的结论是它们离堆栈太远了,理想情况下我们不想处理SQL命令代码本身.

我们已经简要地考虑过我们是否应该使用基于角色/任务的授权模式,并得出一个可靠的结论,即这对我们不起作用,因为它对未来的发展太过限制,并且不适用于我们的扩展计划.

基本上我们得出结论,我们需要实现我们自己的QueryInterceptorAttribute但是认为在尝试重新发明轮子之前我们是否错过了一些东西.

谢谢.

编辑:我忘了提到另一个选项可能是看看使用Decorator模式,我们使用Unity,并且可以添加我们需要的功能:Unity拦截

c# authorization odata asp.net-web-api asp.net-web-api2

8
推荐指数
1
解决办法
1362
查看次数

Linq返回父对象,其子项与单独列表中的所有项匹配

我有一个对象,它有一个可变长度的项目列表(代码示例中的incomingList)和一个人员列表,每个人都有一个项目列表.我想只返回那些包含incomingList中所有项目的人.

所以看一下这个例子,我只想让第一和第三人回来.

人们在数据库中,我想尽可能少地检索数据,所以我想弄清楚linq查询需要做什么来实现这个目标?如果我知道incomingList的长度总是相同,我可以做"......任何(...)&& ...任何(...)&&"等 - 但长度会有所不同.

void Main()
{
    var incomingList = new IncomingItem();

    var matchItem1 = new MatchItem { ItemType = "objectId", ItemValue = "60" };
    var matchItem2 = new MatchItem { ItemType = "area", ItemValue = "CU" };

    incomingList.MatchList = new List<MatchItem>();
    incomingList.MatchList.Add(matchItem1);
    incomingList.MatchList.Add(matchItem2);

    var people = new List<Person>();

    var person1 = new Person { Id = 1 };
    person1.ListOfItems = new List<Item>();
    person1.ListOfItems.Add(new Item { ItemType = "objectId", ItemValue = "60" });
    person1.ListOfItems.Add(new Item { ItemType = …
Run Code Online (Sandbox Code Playgroud)

c# linq entity-framework-6

5
推荐指数
1
解决办法
846
查看次数