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 身份验证
通过 Angular 调用时,Windows 身份验证不适用于 WebAPI