SignalR MVC 5 Websocket没有有效的凭据

时间:2014-11-11 10:57:14

标签: jquery asp.net-mvc controller signalr owin

我尝试在MVC应用程序中使用SignalR。它工作正常,但我在Chrome控制台中收到以下错误

 WebSocket connection to 'ws://localhost:18245/signalr/connect?transport=webSockets&clientProtocol=1.4&connectionToken=bNDGLnbSQThqY%2FSjo1bt
8%2FL45Xs22BDs2VcY8O7HIkJdDaUJ4ftIc54av%2BELjr27ekHUiTYWgFMfG6o7RaZwhf
fpXavzWQ1jvkaxGm5rI%2BWtK7j0g1eQC2aOYP366WmRQLXCiYJfsm4EbwX6T8n2Aw
%3D%3D&connectionData=%5B%7B%22name%22%3A%22importerhub%
22%7D%5D&tid=9' failed: HTTP Authentication failed; no valid credentials available 

有趣的是,我通过Hub从Controller调用的jquery方法运行正常。

jQuery的:

 $(function () {
            // Initialize the connection to the server
            var importerHub = $.connection.importerHub;

            // Preparing a client side function
            // called sendMessage that will be called from the server side
            importerHub.client.sendMessage = function (message) {
                showOrUpdateSuccessMessage(message);
            };
            $.connection.hub.start();
        });

控制器:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<ImporterHub>();
            hubContext.Clients.All.sendMessage("All operations complete");

我使用.Net v4.5.1,SignalR v2.1.2.0和IIS 8.5进行Windows身份验证。

如何解决此错误?

4 个答案:

答案 0 :(得分:42)

您似乎遇到了Chrome问题。问题是Chrome无法正确处理WebSockets的Windows身份验证。

以下是几年前提交的初始问题,报告称Chrome不支持任何形式的HTTP身份验证:

https://code.google.com/p/chromium/issues/detail?id=123862

该问题已针对基本和摘要式身份验证解决,但不适用于Windows(NTLM / Negotiate)身份验证。在不到一个月前创建了一个问题,用于跟踪Chrome支持使用WebSockets进行Windows身份验证的进度:

https://code.google.com/p/chromium/issues/detail?id=423609

显然,Windows身份验证问题在Chrome开发者频道中已部分修复,但前提是客户端在建立WebSocket之前已经过服务器身份验证。

您仍然可以从Controller调用sendMessage的原因是,当WebSocket连接失败时,SignalR会自动回退到使用WebSockets以外的传输(即服务器发送的事件或长轮询)。 Chrome将使用SignalR的其他传输正确处理Windows身份验证。

我建议不要改变任何东西。看起来Chrome最终会支持WebSockets的Windows身份验证。

除了Chrome控制台中的错误之外,唯一真正的问题是在Chrome中建立SignalR连接可能需要稍长的时间。如果这是一个大问题,您可以随时specify what transports the client should attempt using。因此,在Chrome上,您只能尝试serverSentEventslongPolling,但是当Chrome 解决问题时,您将无法使用最佳的传输方式,直到您更改代码。

答案 1 :(得分:0)

这个bug似乎还活着,但看起来它们正在努力。 您可以使用https / wss来解决问题。

codeMonkey阅读answer s SignalR not working with Windows-integrated authentication

答案 2 :(得分:0)

我设法通过切换到Chrome的开发通道来解决此问题:从here下载。 安装完成后,我需要启用chrome:// flags /中的dev标志。 搜索“启用WebSocket连接复用以进行身份​​验证”并启用该功能。 您必须使用69版或更高版本

答案 3 :(得分:0)

这是我解决问题的方式,对我而言,这与Chrome无关。我正在使用chrome,它正在处理实时数据。我的错误是弹簧安全性

.antMatchers("/ws/myapp", "/http/myaap", "/topic/**", "/app/**" ).permitAll()

WebSocket Handshake - Unexpected response code 200 - AngularJs and Spring Boot