如何验证客户端和服务器位于不同域的 websocket 连接?

Dis*_*ive 5 authentication cookies websocket signalr asp.net-web-api

我目前正在使用 SignalR 和 websockets。从我的研究来看,由于 websockets 不支持自定义标头,因此在基于令牌的身份验证期间基本上只有两种方法来验证 websocket 连接。

1) 在查询字符串中传递令牌 2) 将令牌存储在 cookie 中,当 WithCredentials 设置为 true 时,cookie 将传递给服务器

第一种方法不是很好的做法 - 即使通过 websocket 通信加密,查询字符串也可能由服务器等记录。

第二种方法我已经在我的本地机器上工作,但是一旦部署它就不起作用,因为我的客户端和服务器驻留在不同的域中。所以基本上,我有一个 Angular 站点,它有一个域(例如 client.com)和一个 WebAPI 站点,该站点所有 CORS 都具有完全不同的域(例如 server.com)。在我的浏览器上,如果我在 client.com 上,我无法设置根据请求发送到 server.com 的 cookie。

当客户端和服务器位于不同的域时,对 websocket 进行身份验证的好方法是什么?

Saj*_*han 0

协议规范没有指定任何特定的身份验证方式。您需要在握手阶段执行身份验证,为此您可以使用任何 HTTP 身份验证机制,例如 Basic、Digest 等。

此外,您可以研究基于 JWT 令牌的身份验证。Angular 应用程序可以将令牌存储在本地存储中,并在向服务器发出握手请求期间将其作为传输标头发送。如果令牌无效,服务器可以终止 WebSocket 连接升级请求,并且 Angular 应用程序可以将用户重定向到登录页面。

  • 这就是我所说的。我正在使用基于 JWT 令牌的身份验证,但无法将其作为标头发送,因为 websockets 不支持自定义标头。我也无法使用 cookie,因为服务器驻留在不同的域中 (5认同)
  • 在这种情况下,唯一可用的选项是在建立 Websocket 连接后执行身份验证。您可以将 JWT 令牌作为第一条消息发送到服务器,如果它无效,服务器可以终止连接。但这会带来为每个请求完成 websocket 握手的开销。 (2认同)