SignalR + Node WebKit / Node在通过身份validation时无法通过Websocket进行连接

这是一个节点的webkit应用程序,pipe理一堆webkit窗口。 每个webkit窗口使用signalR连接到MVC / webApi / signalR堆栈,没有任何问题。 每个窗口通过websockets连接到1-3个集线器。 一切运作良好。

我的客户希望在pipe理所有其他窗口的基本节点应用程序中使用SignalR。 这是事情变得“有趣”的地方…

因此,虽然节点应用程序正在webkit环境中运行,但它是从文件系统(header:origin = file://)

所以我已经开始了signalR像(没有JSONP,因为我针对websockets)

app.Map("/signalr", map => { map.UseCors(CorsOptions.AllowAll); var hubConfiguration = new HubConfiguration(); map.RunSignalR(hubConfiguration); }); 

所以当我在节点应用程序连接之前,用户login到从节点产生的窗口之一,signalR连接到websockets罚款,并且我没有得到任何错误,当他们login(即用户已更改身份)。

  var connection = window.$.hubConnection("http://localhost"); connection.logging = true; connection.start() .done(function () { console.log('Now connected, connection ID=' + connection.id); }) .fail(function () { console.log('Could not connect'); }); 

问题是我没有在HubCallerConext服务器端的身份。

所以如果用户先login,那么节点应用程序就会在其他产生的窗口中创buildcookie,这就是奇怪的地方。 SignalR无法通过websockets连接,出现以下错误(来自fiddler)

无法识别的用户身份。 在激活的SignalR连接期间,用户身份不能改变。

这里是谈判电话,然后失败的呼叫通过websockets连接(升级)。 我有一个小提琴手规则取代原产地:文件:/与本地主机。 以防万一这是影响它。

 GET http://localhost/signalr/negotiate?clientProtocol=1.4&connectionToken=qs09pHGxr6x5fff1GJ%2FChWUnpSLX5ljV8FuS3h06P%2FhpS55cjNvh2uFHHTXukDI%2BK%2BcgsC6%2BWVJHba4xrkt6IVc2KwGIfm4eeyHrigNFRotjBYKb&connectionData=%5B%7B%22name%22%3A%22windowmanagementhub%22%7D%5D&_=1429572950768 HTTP/1.1 Host: localhost Connection: keep-alive Accept: text/plain, */*; q=0.01 X-DevTools-Emulate-Network-Conditions-Client-Id: 2E81759B-036D-4E92-ADF4-865AFBF59D2 User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Accept-Encoding: gzip, deflate Accept-Language: en-GB,en-us;q=0.8,en;q=0.6 Cookie: ASP.NET_SessionId=opyggkqxnudnuag5mtxy40ai; __APPLICATION_LANGUAGE=en-GB; __RequestVerificationToken=eoB...GHjTo1; .ASPXAUTH=6909...82ED0; WindowsAuthCookie.LoginName=userName Origin: http://localhost 

和回应

 HTTP/1.1 200 OK Cache-Control: no-cache Pragma: no-cache Transfer-Encoding: chunked Content-Type: application/json; charset=UTF-8 Expires: -1 Server: Microsoft-IIS/8.5 Access-Control-Allow-Origin: http://localhost Access-Control-Allow-Credentials: true X-Content-Type-Options: nosniff Date: Mon, 20 Apr 2015 23:46:49 GMT 177 {"Url":"/signalr","ConnectionToken":"LwJz6Ev3+9C/NbKBqHkrI8KwYaz53qiBbzDJVlcse1qRXU3loCqOI68kUb4kpyk8gdQlkKRJ0wBrpb+VVtUMFtrtSQOEhGQE9ZNaMDBajyK2/Evz","ConnectionId":"68e7751b-aaee-4ed7-aa36-a2d1ab25107f","KeepAliveTimeout":20.0,"DisconnectTimeout":30.0,"ConnectionTimeout":110.0,"TryWebSockets":true,"ProtocolVersion":"1.4","TransportConnectTimeout":5.0,"LongPollDelay":0.0} 0 

那么下面的连接头就是获取403的请求

 GET http://localhost/signalr/connect?transport=webSockets&clientProtocol=1.4&connectionToken=LwJz6Ev3%2B9C%2FNbKBqHkrI8KwYaz53qiBbzDJVlcse1qRXU3loCqOI68kUb4kpyk8gdQlkKRJ0wBrpb%2BVVtUMFtrtSQOEhGQE9ZNaMDBajyK2%2FEvz&connectionData=%5B%7B%22name%22%3A%22windowmanagementhub%22%7D%5D&tid=0 HTTP/1.1 Host: localhost Connection: Upgrade Pragma: no-cache Cache-Control: no-cache Upgrade: websocket Origin: http://localhost Sec-WebSocket-Version: 13 User-Agent: Accept-Encoding: gzip, deflate Accept-Language: en-GB,en-us;q=0.8,en;q=0.6 Sec-WebSocket-Key: HqfgeBw4svkTTpBK2CfaJA== Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits 

和403响应

 HTTP/1.1 403 Forbidden Cache-Control: no-cache Pragma: no-cache Transfer-Encoding: chunked Content-Type: text/html Expires: -1 Server: Microsoft-IIS/8.5 Access-Control-Allow-Origin: http://localhost Access-Control-Allow-Credentials: true X-Content-Type-Options: nosniff Date: Mon, 20 Apr 2015 23:46:49 GMT 61 Unrecognized user identity. The user identity cannot change during an active SignalR connection. 0 

这里是控制台中的javascript错误(来自jquery.signalR 2.1.2,不同的连接ID,令牌)

 WebSocket connection to 'ws://localhost/signalr/connect?transport=webSockets&clientProtocol=1.4&connectionToken=xzGshRPvF1XvGnq2S2nDmGZ3TISMGEt01Au0z9J%2FAfMa2OtQUMW5XX5HgW0I4n2MK5UfGfpJ4%2Fl7OkiRpQlSIFrDkfy25WHScwpkubBsn5403%2Ba3&connectionData=%5B%7B%22name%22%3A%22windowmanagementhub%22%7D%2C%7B%22name%22%3A%22browserloghub%22%7D%5D&tid=1' failed: Error during WebSocket handshake: Unexpected response code: 403 

SignalR将(正确)回退到SSE并成功连接。 我可以看到用户服务器的身份。

我真的很想明白,为什么我不能通过websockets连接,当用户通过身份validation。 如果我延迟所有窗口连接到服务器通过signalR直到用户通过身份validation,然后我也看到相同的行为。

任何帮助或线索将不胜感激。