如何验证客户端和服务器位于单独域上的websocket连接?

时间:2017-11-26 11:49:06

标签: authentication asp.net-web-api cookies websocket signalr

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

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

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

我在本地计算机上工作的第二种方法,但由于我的客户端和服务器位于不同的域上,因此部署后无效。基本上,我有一个Angular站点,它有一个域(例如client.com)和一个WebAPI站点,它将CORS与一个完全不同的域(例如server.com)结合在一起。在我的浏览器上,如果我在client.com上,我无法设置根据请求发送到server.com的cookie。

当客户端和服务器位于不同的域上时,验证websockets的好方法是什么?

1 个答案:

答案 0 :(得分:0)

WebSocket Protocol specification未指定任何特定的身份验证方式。您需要在握手阶段执行身份验证,并且您可以使用任何HTTP身份验证机制,如Basic,Digest等。

此外,您可以查看JWT token based authentication。 Angular app可以将令牌存储在local storage中,并在握手请求期间将其作为传输头发送给服务器。如果令牌无效,服务器可以终止WebSocket连接升级请求,Angular应用程序可以将用户重定向到登录页面。

相关问题