7

我是整个客户端 SPA 世界的新手。我正在使用上述技术,这似乎很有希望。但是,我无法轻易克服的一个巨大障碍是缺乏内置安全性。我不得不手动推出用户授权,恕我直言,这应该是框架的一部分。

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

例如,假设有来自数据服务的调用,如下所示:

function getItems(){        
         var query = breeze.EntityQuery.from('Items').expand("Person");
         return manager.executeQuery(query);
}

这会得到所有的物品,不好。因此,让我们通过 userId 进行限制:

function getItems(userId){        
         var query = breeze.EntityQuery.from('Items').where("userId", "==", authentication.userId).expand("Person");
         return manager.executeQuery(query);
}

在第二个示例中,我们从身份验证服务中获取 userId,该服务存储了用户登录时的 userId。但是,恶意用户可以轻松访问浏览器控制台并更改该值。

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

4

2 回答 2

12

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

例如,您是否研究过ASP.NET Breeze/Knockout 模板[Authorize]它使用 Forms Auth 进行身份验证,并使用属性保护 Web API 控制器。只有登录用户才能访问任何控制器方法。

该身份验证还设置了IPrincipalWeb API 控制器通过其User属性提供的内容。你会看到User传递给TodoRepository. 在该存储库中,您会发现保护逻辑来限制查询并仅保存到属于请求用户的 Todo 信息。

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

该示例中的一个明显缺陷是客户端/服务器流量以明文方式进行。在投入生产之前,您必须添加传输级别安全性 (HTTPS)。但这毕竟是一个演示。

于 2013-05-05T23:06:52.937 回答
2

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

于 2013-05-05T03:57:14.377 回答