长轮询服务器原理(客户端认证)

3

假设我有一个长轮询服务器,它可以正常工作 - 当新客户端连接到网站时(他只是匿名连接而没有身份验证),会发出新的GUID并将其存储在签名cookie中,在客户端和服务器之间的轮询期间标识此连接。

现在客户端想要登录并继续作为已认证用户。问题是长轮询服务器(node.js)和Web框架(ASP.NET)作为独立系统运行。我可以使用ASP.NET(MVC)特定的身份验证机制从Web框架的角度进行登录,但这不影响长轮询服务器(其中我仍然被称为某个GUID的人)。如何从长轮询服务器的角度安全地验证用户?针对这种情况是否有任何“最佳实践”?经过身份验证的客户端应该进一步通过其唯一键(例如电子邮件地址而不是GUID)进行标识。

2个回答

2

我目前也面临着同样的问题,以下是我的解决方案:

我有一个用Java编写的REST服务器,为我的Web客户端提供API。为了进行长轮询,我编写了一个小型的node.js服务器。

  1. 客户端通过HTTPS连接到node.js并发送用户名/密码。您还可以传递会话令牌。
  2. node.js调用REST服务器以验证使用给定凭据的用户
  3. 如果用户已通过身份验证,则node.js等待或发送401

好处在于,node.js服务器不需要了解DB结构,也不需要包含SQL调用。这也允许使用Python twisted重写服务器。


2

我能想到的一个方法:

  1. 发出一个会话ID,可以使用ASP.net工具或者发出额外的会话ID,你可能需要连接到ASP.net auth来在需要时使其无效
  2. 在进行长轮询时,请确保将cookie一起发送,以便Node.js服务器接收它。
  3. 将GUID保存到可以从ASP和Node.js访问的数据库中。

其余的应该很清楚,至于你可以使用哪些数据库,我没有任何经验,但是有很多Node.js包装器的数据库,尽管其中许多未得到维护或不完整。

您应该查看Node.js wiki中的数据库列表,并查看每个数据库,不要忘记在Google上搜索它,并检查问题以查看是否存在重大缺陷。

哦,还有另一个(无需数据库)的解决方案:

  1. 通过ASP.net进行身份验证
  2. 当Node.js接收到auth cookie时,将其转发给一个特殊的ASP.net页面(您可以仅从localhost访问该页面),该页面只告诉Node.js此请求是否有效(它还可以向Node.js提供一些用户数据)
  3. 只有请求有效时,才开始长轮询

这在同一服务器上进行时几乎不会引入任何延迟。


谢谢您的想法。我也在考虑共享数据库解决方案。第二个解决方案听起来很有趣,特别是本地主机页面可以返回当前已验证的用户标识符(ASP.NET User.Identity.Name属性)。 - yojimbo87

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接