3

我有一个 ASP MVC4 网站。最初,大部分内容都是通过控制器提供的,正如人们所期望的那样。我已将数据存储从 SQL Server 移至 MongoDB。我还添加了很多 ajax 来更新数据客户端,没有完全刷新。这工作正常,但我的控制器现在有很多采用 json 并返回 json 的方法。我能够构建一个访问数据库并公开完全相同的功能的 Node.js 服务器,而无需大量往返 C#。

我的 javascript 客户端现在正在调用 Node.js REST API,这很好用。我的“安全”代码(如添加新用户)从服务器端访问相同的 REST API。

我的问题是:如何正确处理安全问题?我有三种情况:

  1. GET api/messages:不需要安全性,我想通过 Json REST API 向任何感兴趣的人公开我的站点消息。
  2. GET api/my/messages:只有当用户登录时我才需要允许访问它(它获取用户的消息)。
  3. POST api/users:这是一个只能从服务器调用的函数,其他任何东西都不能使用它。

由于用户已经登录到我的 ASP 网站,我如何使用他们的登录凭据通过我的 REST 服务对他们进行身份验证?当用户登录时,页面客户端会定期点击它进行更新。

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

提前致谢!

4

3 回答 3

2

创建两个身份验证中间件处理程序。一个添加到所有“我的”路由中,另一个添加到 POST 路由中。

“我的”身份验证器获取请求中存在的 asp.net auth cookie,并使用它对您的 asp.net mvc 站点进行 http 调用。

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

如果对节点的请求没有 cookie,则再次返回 401。此外,为了防止过多地调用您的 mvc 站点来检查 cookie,您可以使用 cookiesession 中间件在客户端上设置一个带有身份验证标志的 cookie。这将为您的客户端生成 2 个 cookie,但这应该不是问题。只需让节点一在 aspx 一之前过期。

POST 身份验证器中间件可以在您的节点和 mvc 服务器之间使用您喜欢的任何共享密钥。例如,请求中的特殊标头。

于 2013-07-18T17:56:26.233 回答
0

正如您所说,所有安全调用都已经通过您的 MVC 服务器代码,而 MVC 服务器代码又调用了 Node.js 代码,对吗?基本上,您需要一种方法来阻止不是您的 MVC 代码的其他客户端对此 Node.js 的调用。

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

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

  2. 如果需要,Node 服务器还可以检查呼叫来源,因此您可以根据 IP 进行过滤,并且只允许您的 MVC 代码所在的 IP

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

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

于 2013-07-18T14:22:00.430 回答
0

如果用户需要登录,您可以在控制器操作上使用 [Authorize]。自动化将像任何其他 web 请求一样处理。

此外,您可能会考虑为您的 api 请求添加一个密钥,您可以在初始页面加载时提供该密钥。自动化用户将拥有一个 GUID,他将通过 api 调用发送该 GUID。您可以检查此密钥是否由您的应用程序颁发给有效用户。

于 2013-07-18T14:13:02.993 回答