SignalR 不适用于 Windows 集成身份验证

Posted

技术标签:

【中文标题】SignalR 不适用于 Windows 集成身份验证【英文标题】:SignalR not working with Windows-integrated authentication 【发布时间】:2017-06-18 07:55:28 【问题描述】:

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

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

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

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

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

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

我该如何解决?

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

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

【问题讨论】:

【参考方案1】:

2020 年更新:看起来 Chrome 现在支持 WS-connections 上的 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 开发人员添加任何输入,请在此处 https://bugs.chromium.org/p/chromium/issues/detail?id=423609 在 Chromium bugtracker 中有一个未解决的问题。

【讨论】:

我已将 [Authorize] 添加到我的集线器,并调用 GlobalHost.HubPipeline.RequireAuthentication();在 Startup.cs 但我仍然无法让它工作。然后我在 JS 中添加了传输类型,但仍然无法正常工作。有人有其他建议吗?【参考方案2】:

我也遇到了这个错误,但只是在使用http进行本地开发时;我认为 Chrome 不喜欢不安全的ws:// 连接。一旦我使用安全的https 连接部署到服务器,WebSocket 连接就升级到wss://,Chrome 不再抱怨,与 WebSockets 一起工作正常——不必回退到其他传输。

tl:博士;确保为您的网站使用https

【讨论】:

以上是关于SignalR 不适用于 Windows 集成身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Windows 身份验证不适用于 HttpClient [重复]

System.Net.WebClient 不适用于 Windows 身份验证

Windows 身份验证不适用于 SQL Server

通过 Angular 调用时,Windows 身份验证不适用于 WebAPI

允许任何用户在没有凭据的情况下使用 cors 访问“signalr/hubs”(服务器运行 Windows 身份验证)

REST 服务的身份验证不适用于 jBPM(KIE 服务器和业务中心)和 Keycloak