Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Entity framework 如何将基于角色的安全性应用于odata/breezejs查询的结果?_Entity Framework_Asp.net Web Api_Odata_Breeze_Role Based Access Control - Fatal编程技术网

Entity framework 如何将基于角色的安全性应用于odata/breezejs查询的结果?

Entity framework 如何将基于角色的安全性应用于odata/breezejs查询的结果?,entity-framework,asp.net-web-api,odata,breeze,role-based-access-control,Entity Framework,Asp.net Web Api,Odata,Breeze,Role Based Access Control,在我看来,breeze/odata查询对数据的安全访问带来了重大风险。例如,考虑到我有一个与受限实体(R)相关的无限制实体(U)。我不会公开一个端点来查询R,我会在不包含相关Rs的情况下编写客户端来查询U。但是,恶意客户端可能会请求相关Rs 我如何防止这种情况 我有一些想法。但是,我还没有能够实施它们,还不能说它们是否有效。尽管如此,以下是我的想法: 1) 检查每个结果实体——在执行查询之后,但在将结果发送到客户端之前。但是,我不知道如何在执行和发送到客户端之间插入检查代码(通过回调或其他方式)

在我看来,breeze/odata查询对数据的安全访问带来了重大风险。例如,考虑到我有一个与受限实体(R)相关的无限制实体(U)。我不会公开一个端点来查询R,我会在不包含相关Rs的情况下编写客户端来查询U。但是,恶意客户端可能会请求相关Rs

我如何防止这种情况

我有一些想法。但是,我还没有能够实施它们,还不能说它们是否有效。尽管如此,以下是我的想法:

1) 检查每个结果实体——在执行查询之后,但在将结果发送到客户端之前。但是,我不知道如何在执行和发送到客户端之间插入检查代码(通过回调或其他方式):(

2) 将smarts添加到POCO,以根据用户角色检查受限实体和属性。例如,而不是:

class MyThing{
  public string P {get;set;}
}
我想要这样的:

private string _p;
public string P 
{ 
  get 
  { 
    if (UserRoles.HasAny("role-a","role-b"))
      return _p;
    return null; 
  }
  set { _p = value; }
}
这看起来很恶心,因为POCO应该是哑巴。POCO需要能够从某处读取用户角色。。。也许是HTTP会话。我不太知道那会怎样

我已经阅读了以下问题/答案,但它们对我没有帮助: , , 您可以使用 如中所述,防止客户端执行
$expand

另一种方法是将用作WebAPI控制器方法的参数。这将为您提供服务器方法中查询谓词的详细信息,以便您可以根据需要应用它们,而不是让WebAPI自动应用它们。这将允许您根据查询进行扩展或不扩展

查看和了解其工作原理。

您可以使用 如中所述,防止客户端执行
$expand

另一种方法是将用作WebAPI控制器方法的参数。这将为您提供服务器方法中查询谓词的详细信息,以便您可以根据需要应用它们,而不是让WebAPI自动应用它们。这将允许您根据查询进行扩展或不扩展


看看并看看它是如何工作的。

感谢所有读过我的问题、思考过它甚至做出回应的人。但是,没有任何建议对我有效。所以,我自己想出来了。我可以实现我的选项#1我的一些breeze类的子类化。我创建了EnableBreezeQueryAttribute子类,以便覆盖NewQueryHelper以返回我的QueryHelper子类。然后,我在服务方法上使用CustomEnableBreezeQueryAttribute。ValidateData方法与实体对象一起调用。如果该方法包含受限信息,我可能会失败,或者我可能会清空受限信息——允许返回非受限信息

public class CustomEnableBreezeQueryAttribute : EnableBreezeQueryAttribute
{
    private class CustomQueryHelper : QueryHelper
    {
        public override IEnumerable PostExecuteQuery(IEnumerable queryResult)
        {
            queryResult = ValidateData(queryResult);
            return base.PostExecuteQuery(queryResult);
        }

        private IEnumerable ValidateData(IEnumerable queryResult)
        {
            //TODO: validate/modify data
        }
    }

    protected override QueryHelper NewQueryHelper()
    {
        return new CustomQueryHelper();
    }
}

我感到惊讶的是,弄明白如何做到这一点是多么困难。在这一点上注入代码并不容易。给我留下了一个唠叨的问题:我在做一些不应该做的事情吗?或者这真的是odata/breeze功能上的漏洞?或者这就是odata/breeze中的工作方式?

感谢所有阅读、思考过我的问题甚至做出回应的人。但是,没有任何建议对我有效。所以,我自己想出来了。我可以实现我的选项#1我的一些breeze类的子类化。我创建了EnableBreezeQueryAttribute子类,以便覆盖NewQueryHelper以返回我的QueryHelper子类。然后,我在服务方法上使用CustomEnableBreezeQueryAttribute。ValidateData方法与实体对象一起调用。如果该方法包含受限信息,我可能会失败,或者我可能会清空受限信息——允许返回非受限信息

public class CustomEnableBreezeQueryAttribute : EnableBreezeQueryAttribute
{
    private class CustomQueryHelper : QueryHelper
    {
        public override IEnumerable PostExecuteQuery(IEnumerable queryResult)
        {
            queryResult = ValidateData(queryResult);
            return base.PostExecuteQuery(queryResult);
        }

        private IEnumerable ValidateData(IEnumerable queryResult)
        {
            //TODO: validate/modify data
        }
    }

    protected override QueryHelper NewQueryHelper()
    {
        return new CustomQueryHelper();
    }
}

我感到惊讶的是,弄明白如何做到这一点是多么困难。在这一点上注入代码并不容易。给我留下了一个唠叨的问题:我在做一些不应该做的事情吗?或者这真的是odata/breeze功能上的漏洞?或者在odata/breeze中就是这样做的?

防止扩展的范围太广,因为在某些情况下,扩展可以扩展到不受限制的表中,但同时不能扩展到受限制的表中。如果我能列出哪些表不允许展开,这种机制就会起作用。至于你的第二个想法:我试试看!我确实想知道客户端代码是否需要更改,或者参数是否会自动加载。另外,我想我可以选择1)检查odata选项或2)应用odata选项,执行查询,然后检查查询结果。因此,options参数会自动加载。酷!而且它是有效的。。。有时候。但有时我会遇到这样的错误:[[System.NotSupportedException:无法强制转换类型'System.Web.Http.OData.Query.Expressions.SelectExpandBinder+SelectAllAndExpand'1[[DevList_Steve.Model.IssueTag,DevList Steve,Version=1.0.6103.15380,Culture=neutral,PublicKeyToken=null]]'to type'DevList_Steve.Model.IssueTag'。LINQ to Entities仅支持强制转换EDM基元或枚举类型。]]因此,遗憾的是,这对我来说不起作用。防止扩展的范围太广,因为在某些情况下允许扩展到不受限制的表中,但同时不能扩展到受限制的表中。如果我能列出哪些表不允许展开,这种机制就会起作用。至于你的第二个想法:我试试看!我确实想知道客户端代码是否需要更改,或者参数是否会自动加载。另外,我想我可以选择1)检查odata选项或2)应用odata选项,执行查询,然后检查查询结果。因此,options参数会自动加载。酷!而且它是有效的。。。有时候。但有时我会遇到以下错误:[[System.NotSupportedException:无法强制转换类型'System.Web.Http.OData.Query.Expressions.SelectExpandBinder+SelectAllAndExpand'1[[DevList]_