Asp.net web api Hot Tower/Durandal/Breeze.js:如何垂直保护数据调用?

Asp.net web api Hot Tower/Durandal/Breeze.js:如何垂直保护数据调用?,asp.net-web-api,breeze,durandal,hottowel,Asp.net Web Api,Breeze,Durandal,Hottowel,我对整个客户端水疗世界都是新手。我正在使用上述技术,这似乎很有希望。然而,我无法轻易克服的一个巨大障碍是缺乏内置的安全性。我必须手动推出用户授权,IMHO应该是框架的一部分 现在我已经整理好了,垂直安全性让我头疼:一个用户登录了,但通过在浏览器控制台中更改一些参数可以轻松访问其他用户的信息。我可以在每次调用时传递用户ID,然后将其与服务器上的用户ID进行比较,但我希望有一个总体解决方案不会用用户ID污染breeze数据调用 例如,假设有一个来自数据服务的呼叫,如下所示: function get

我对整个客户端水疗世界都是新手。我正在使用上述技术,这似乎很有希望。然而,我无法轻易克服的一个巨大障碍是缺乏内置的安全性。我必须手动推出用户授权,IMHO应该是框架的一部分

现在我已经整理好了,垂直安全性让我头疼:一个用户登录了,但通过在浏览器控制台中更改一些参数可以轻松访问其他用户的信息。我可以在每次调用时传递用户ID,然后将其与服务器上的用户ID进行比较,但我希望有一个总体解决方案不会用用户ID污染breeze数据调用

例如,假设有一个来自数据服务的呼叫,如下所示:

function getItems(){        
         var query = breeze.EntityQuery.from('Items').expand("Person");
         return manager.executeQuery(query);
}
这将得到所有的项目,不好。因此,让我们通过用户ID进行限制:

function getItems(userId){        
         var query = breeze.EntityQuery.from('Items').where("userId", "==", authentication.userId).expand("Person");
         return manager.executeQuery(query);
}
在第二个示例中,我们从身份验证服务获取userId,该服务在用户登录时存储userId。但是,恶意用户可以很容易地进入浏览器控制台并更改该值


当然,我可以使用withParameters(…)传递用户ID,并将其与服务器上的当前用户ID进行比较,但每次调用我都必须这样做,这似乎是不对的。有没有更好的方法来保护使用受信任用户id的呼叫?

为什么不在控制器中执行此操作?
如果Web Api受[Authorize]保护,则您可以在控制器中获取用户ID,并确保返回的数据是针对当前登录的用户的。

@Ali-我理解您的痛苦和担忧。你有权担心任何形式的所谓安全性,这种安全性依赖于URL中传递的信息。幸运的是,您的问题有很好的答案,Breeze应用程序可以很好地解决这些问题

例如,你有没有研究过这个问题?它使用Forms Auth进行身份验证,并使用
[Authorize]
属性保护Web API控制器。只有登录的用户才能访问任何控制器方法

该身份验证还设置Web API控制器通过其
User
属性提供的
IPrincipal
。您将看到
User
传递给
TodoRepository
的构造函数。在该存储库中,您将找到用于限制查询并仅保存属于请求用户的Todo信息的保护逻辑

看看网络流量。在URL或请求/响应正文中找不到任何用户标识信息。您将在标头中看到加密的身份验证cookie

该示例中的一个明显缺陷是,客户端/服务器通信发生在clear中。在投入生产之前,必须添加传输级别安全性(HTTPS)。但这毕竟是一个演示


正如我所说的,我知道我可以做到这一点,我只是想知道是否有某些总体技术可以更好地保护代码。然而,在服务器端工作时,考虑到“保护”呼叫实际上是特定于应用程序的,这可能是不可行的。嗨,沃德,谢谢你的回复。是的,我最终做了一些与您提到的非常类似的事情(现在不包括存储库),因此所有调用的范围都是服务器端的用户。继续努力:)问题中的链接似乎不再有效。看起来仍然有一个淘汰样本,但我看不到@Ward引用的Auth内容。