asp.net - SignalR 不支持 Windows 集成身份验证

标签 asp.net websocket signalr windows-authentication ntlm

我有一个 ASP.NET MVC 4 应用程序 (.NET 4.5),SIignalR 可以很好地处理基于表单的身份验证(通过 IIS/IIS Express 托管)

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

jquery.signalR-2.2.2.min.js:9 WebSocket connection to ws://localhost:51030/signalr/connect?transport=webSockets&blhablahblah failed: Error during WebSocket handshake: Unexpected response code: 403

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

WebSocket connection to ws://localhost:51030/signalr/connect?transport=webSocketsblahblah failed: HTTP Authentication failed; no valid credentials available

应用程序的其他部分工作正常,Windows-auth 在服务器上启用并工作,等等。

如何解决这个问题?

如果由于某种原因无法解决(可能是 Chrome 不支持 websocket 连接上的 windows 身份验证或其他原因) - 为什么它不回退到非 websocket 协议(protocol)?以及如何解决我是否强制回退?

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

最佳答案

2020 年更新:Chrome 现在支持 WS 连接上的 NTLM,这不再是问题

<小时/>

...提出问题 10 小时后...

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

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

您还可以通过调用指定哪个传输方式:

$.connection.hub.start( { transport: ['webSockets', 'longPolling'] });

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

原因

该错误是由 Chrome 引起的,它不支持 websocket 连接上的 NTLM。有趣的是,IE、MS Edge 和 Firefox 都支持它(“Chrome 是新的 IE”呵呵)。

Chromium bugtracker 中存在一个 Unresolved 问题 https://bugs.chromium.org/p/chromium/issues/detail?id=423609如果有人想向 Chromium 开发人员添加任何输入。

关于asp.net - SignalR 不支持 Windows 集成身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44612867/

相关文章:

websocket - SignalR/Websockets 连接限制和最佳实践

javascript - Websocket数据更新ChartJs图表

websocket - AspNetCore 中的 WebSocket 实现是否可以替代 SignalR?

jquery - 将 Typeahead.js 与 ASP.Net Webmethod 集成

asp.net - Paypal PayFlow Pro Asp.Net 配置

c# - 结构图配置异常

web - 在 Service Stack REST API 服务中使用 SignalR

asp.net - 如何使用 asp.net 获取 html 选择的选定值

javascript - 无法捕获 Web 套接字异常

asp.net - 如何从集线器类之外获取SignalR用户连接ID?