作者:壹起等绿灯 | 来源:互联网 | 2023-01-31 21:30
我有一个ASP.NET MVC 4应用程序(.NET 4.5)和SIgnalR与基于表单的身份验证(通过IIS/IIS Express托管)工作正常
一旦我将应用程序更改为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也没有帮助.
1> Alex..:
...... 10个小时后......
部分解决(回答我自己的问题)
使用它后,我可以确认,将[Authorize]
属性添加到我的集线器(或者,添加GlobalHost.HubPipeline.RequireAuthentication();
到"Startup.cs")实际上确实有帮助.它现在回退到另一种传输,即使错误仍然被抛入浏览器的控制台.
您还可以通过调用以下内容指定它回退到哪个传输:
$.connection.hub.start( { transport: ['webSockets', 'longPolling'] });
如果您不喜欢默认优先级(我猜,"隐藏的iframe"是默认的第二个选项).
原因
该错误是由Chrome引起的,它不支持websocket连接上的NTLM.有趣的是,IE,MS Edge和Firefox都支持它("Chrome是新的IE"吧).
如果有人想要向Chromium开发者添加任何输入,那么在Chromium bugtracker中存在一个未解决的问题https://bugs.chromium.org/p/chromium/issues/detail?id=423609.