我有一个 ASP.NET MVC 4 应用程序 (.NET 4.5),SIignalR 可以很好地处理基于表单的身份验证(通过 IIS/IIS Express 托管)
一旦我将应用程序更改为 Windows 集成身份验证(<authentication mode="Windows"/>
在“web.config”中)它停止工作。
jquery.signalR-2.2.2.min.js:9WebSocket 连接到ws://localhost:51030/signalr/connect?transport=webSockets&blhablahblah
失败的:WebSocket 握手期间出错:意外的响应代码:403
添加后[Authorize]
归因于我的集线器,错误更改为
WebSocket 连接到ws://localhost:51030/signalr/connect?transport=webSocketsblahblah
failed:HTTP认证失败;没有可用的有效凭据
应用程序的其他部分工作正常,Windows-auth 在服务器上启用并工作,等等。
我该如何解决这个问题?
如果由于某种原因无法解决(可能是 Chrome 不支持 websocket 连接上的 Windows 身份验证或其他原因)-为什么它不回退到非 websocket 协议?以及如何强制回退?
更新:我创建了一个 github 问题https://github.com/SignalR/SignalR/issues/3953。问题不在于我无法连接。问题是我无法处理错误以回退到另一种传输方式。两者都不.fail()
not .error()
正在被调用。 try-catch 也没有帮助。
2020 年更新:看起来 Chrome 现在支持 WS 连接上的 NTLM,这不再是问题
...问完问题10个小时后...
部分解决(回答我自己的问题)
玩过之后我可以确认,添加[Authorize]
归因于我的中心(或者添加GlobalHost.HubPipeline.RequireAuthentication();
到你的“Startup.cs”)实际上确实有帮助。现在确实回落了到替代传输,即使错误仍然被抛出到浏览器的控制台中。
您还可以指定which通过调用以下方法将其返回到传输:
$.connection.hub.start( { transport: ['webSockets', 'longPolling'] });
如果您不喜欢默认优先级(我猜,“隐藏 iframe”是默认的第二个选项)。
原因
该错误是由 Chrome 引起的,它不支持 websocket 连接上的 NTLM。有趣的是,IE、MS Edge 和 Firefox 都支持它(“Chrome 是新的 IE”哈哈)。
Chromium bugtracker 中有一个未解决的问题https://bugs.chromium.org/p/chromium/issues/detail?id=423609如果有人想向 Chromium 开发者添加任何意见。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)