Authentication 如果客户端和服务器位于不同的域上,如何对websocket连接进行身份验证?

Authentication 如果客户端和服务器位于不同的域上,如何对websocket连接进行身份验证?,authentication,asp.net-web-api,cookies,websocket,signalr,Authentication,Asp.net Web Api,Cookies,Websocket,Signalr,我现在正在玩信号器和websockets。从我的研究看来,由于websocket不支持自定义头,在基于令牌的身份验证期间,基本上只有两种方法来验证websocket连接 1) 在查询字符串中传递令牌 2) 将令牌存储在cookie中,当WithCredentials设置为true时,cookie将传递给服务器 第一种方法不是很好的实践——即使通过加密websocket通信,服务器也可能会记录查询字符串等 第二种方法在我的本地机器上工作,但部署后就不起作用了,因为我的客户机和服务器位于不同的域上。

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

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

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

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

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

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


你可以进一步调查。Angular应用程序可以将令牌存储在中,并在握手请求期间将其作为传输头发送到服务器。如果令牌无效,服务器可以终止WebSocket连接升级请求,Angular应用程序可以重新引导用户登录页面。

我就是这么说的。我使用的是基于JWT令牌的身份验证,无法将其作为头发送,因为WebSocket不支持自定义头。我也不能使用cookies,因为服务器位于不同的域JavaScript客户端API没有提供截获握手响应的HTTP头的方法。因此,对于第一次身份验证,您需要通过websocket连接发送JWT令牌。在这种情况下,唯一可用的选项是在建立websocket连接后执行身份验证。您可以将JWT令牌作为第一条消息发送到服务器,如果它无效,服务器可以终止连接。但这会带来为每个请求完成websocket握手的开销。基本上,您需要在WebSocket之上实现自定义协议。如果可能,您还可以尝试将客户的IP地址列入白名单,以防止额外的连接。或者翻来覆去,多次失败的消息身份验证尝试将源IP列入黑名单。我讨厌使用SignalR进行身份验证如此困难,似乎这是一项基本要求,我已经坐了几个小时试图弄清楚如何进行。