在我看来,微风/odata 查询对数据的安全访问存在重大风险。例如,假设我有一个与受限实体 (R) 相关的非受限实体 (U)。我不会公开一个端点来查询 R,我会编写我的客户端来查询 U,而不包括相关的 R。但是,恶意客户端可以请求相关的 Rs。
我该如何防止这种情况?
我有几个想法。但是,我还没有能够实现它们,还不能说它们是否有效。尽管如此,以下是我的想法:
1) 检查每个结果实体——在执行查询之后但在结果发送到客户端之前。但是,我不知道如何在执行和发送到客户端之间插入我的检查代码(通过回调或其他方式):(
2) 将智能添加到 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 会话。我不太清楚这将如何运作。
我已阅读以下问题/答案,但它们对我没有帮助: breezejs 和 EF6 中基于角色的安全性,breeze.js如何 处理安全性并避免暴露业务逻辑, 如何使用 Breeze JS 处理授权?