处理将JS用于REST API的ASP MVC应用程序中的安全性

我有一个ASP MVC4网站。 本来,大部分的内容是通过控制器服务,如人们所期望的。 我已经将数据存储从SQL Server移动到MongoDB。 我还添加了很多ajax来更新数据客户端,而没有完整的刷新。 这工作正常,但我的控制器现在有很多采取JSON和返回JSON的方法。 我能够构build一个命中数据库的Node.js服务器,并且公开了完全相同的function,而不需要大量的C#。

我的JavaScript客户端现在正在调用Node.js REST API,这很好。 我的'安全'的代码(如添加一个新的用户)从服务器端命中相同的REST API。

我的问题是:我怎样才能妥善处理这个安全? 我有三种情况:

  1. GET api / messages:不需要安全性,我想通过Json REST API将我的网站的消息展示给任何感兴趣的人。
  2. GET api / my / messages:我只有在用户login时才允许访问(获取用户的消息)。
  3. POST api / users:这是一个只能从服务器调用的函数,没有别的东西能够使用它。

由于用户已经login到我的ASP网站,我怎样才能使用他们的login凭据来使用我的REST服务进行身份validation? 用户login时,客户端页面会定期点击更新。

有没有明智的/标准的方法来做到这一点? 其核心思想是客户端代码使用至less部分向公众开放的REST API,事实上API提供了我所有的业务逻辑 – 只有部分(如创build用户)被locking到超级pipe理员只。

提前致谢!

创build两个身份validation中间件处理程序。 一个你添加到所有“我的”路线和另一个你添加到您的POST路线。

“我的”身份validation器采取请求中存在的asp.net身份validationcookie,并与您的asp.net mvc网站进行http调用。

您需要一个操作,如果cookie无效,则返回401,否则返回有关该用户权限的某些信息。

如果进入节点的请求没有cookie,则再次返回401。 另外,为了防止你的mvc网站过多调用cookie来检查cookie,你可以使用cookiesession中间件在客户端上设置一个标识为cookie的cookie。 这将导致您的客户2cookies,但这不应该是一个问题。 只要使节点在aspx之前到期即可。

POST身份validation器中间件可以使用您的节点和mvc服务器之间的任何共享密钥。 例如请求中的特殊标题。

如果用户需要login,您可以使用控制器操作上的[授权]。 Autorization将像其他任何webrequest一样处理。

此外,您可能会考虑添加一个键到您可以在初始页面加载中提供的API请求。 一个autorized用户将有一个GUID,他将与api呼叫一起发送。 您可以检查这个密钥是否由您的应用程序发布给有效的用户。

正如你所说,所有的安全调用已经通过你的MVC服务器代码,然后调用Node.js代码,我说得对吗? 基本上你需要一种方法来阻止来自不是你的MVC代码的其他客户端的这个Node.js调用。

大声思考,这是我脑海中浮现的想法:

  1. 仅在MVC和Node之间使用SSL。 您可以设置客户端和服务器证书,以便节点代码将仅在身份validation后进行响应(我不知道节点如何处理SSL,因此您需要一些文档

  2. 如果你愿意,节点服务器也可以检查呼叫源,所以你可以过滤基于IP,只允许您的MVC代码所在的IP

  3. 在节点代码的安全方法上使用encryption的身份validation令牌。 再次,我不是一个真正的Node专家,但我可以想象它有解密令牌的方法,或者您可以简单地将其基于随机数与一个共同的种子…如果没有人有权访问您的服务器代码理想情况下,没有人应该能够猜出这个令牌。 再一次,SSL将有助于防止stream量嗅探

我很确定人们会想出其他的想法。 对我来说,最基本的事情是确保安全的方法只能通过SSL连接访问,并在这个连接上,你可以交换所有你想要的信息(令牌,密码等)。