SignalR无法与Windows集成的身份验证一起使用

Ale*_*lex 8 asp.net ntlm windows-authentication websocket signalr

我有一个ASP.NET MVC 4应用程序(.NET 4.5)和SIgnalR与基于表单的身份验证(通过IIS/IIS Express托管)工作正常

一旦我将应用程序更改为Windows集成身份验证(<authentication mode="Windows"/>在"web.config"中)它就会停止工作.

jquery.signalR-2.2.2.min.js:9 WebSocket连接ws://localhost:51030/signalr/connect?transport=webSockets&blhablahblah失败:WebSocket握手期间出错:意外响应代码:403

[Authorize]属性添加到我的集线器后,错误将更改为

WebSocket连接ws://localhost:51030/signalr/connect?transport=webSocketsblahblah失败:HTTP身份验证失败; 没有有效的凭证

该应用程序的其他部分工作正常,在服务器和工作等启用Windows身份验证等.

我该如何解决这个问题?

如果它由于某种原因无法解决(可能是Chrome不支持在websocket连接上使用windows auth或其他东西) - 为什么它不回归到非websocket协议?以及如何强制退回?

更新:我创建了一个github问题https://github.com/SignalR/SignalR/issues/3953.问题不在于我无法连接.问题是我无法处理错误以回退到另一个传输.也.fail()没有.error()被调用.Try-catch也没有帮助.

Ale*_*lex 9

...... 10个小时后......

部分解决(回答我自己的问题)

使用它后,我可以确认,将[Authorize]属性添加到我的集线器(或者,添加GlobalHost.HubPipeline.RequireAuthentication();到"Startup.cs")实际上确实有帮助.它现在回退到另一种传输,即使错误仍然被抛入浏览器的控制台.

您还可以通过调用以下内容指定它回退到哪个传输:

$.connection.hub.start( { transport: ['webSockets', 'longPolling'] });
Run Code Online (Sandbox Code Playgroud)

如果您不喜欢默认优先级(我猜,"隐藏的iframe"是默认的第二个选项).

原因

该错误是由Chrome引起的,它不支持websocket连接上的NTLM.有趣的是,IE,MS Edge和Firefox都支持它("Chrome是新的IE"吧).

如果有人想要向Chromium开发者添加任何输入,那么在Chromium bugtracker中存在一个未解决的问题https://bugs.chromium.org/p/chromium/issues/detail?id=423609.