Asp.net

SignalR 不適用於 Windows 集成身份驗證

  • October 2, 2020

我有一個 ASP.NET MVC 4 應用程序 (.NET 4.5),並且 SIGnalR 可以很好地處理基於表單的身份驗證(通過 IIS/IIS Express 託管)

一旦我將應用程序更改為 Windows 集成身份驗證(<authentication mode="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-auth 並且可以正常工作,等等。

我該如何解決這個問題?

如果由於某種原因無法解決(可能是 Chrome 不支持 websocket 連接上的 Windows 身份驗證或其他原因) -**為什麼它不回退到非 websocket 協議?**以及如何強制回退?

更新:我創建了一個 github 問題https://github.com/SignalR/SignalR/issues/3953。問題不在於我無法連接。問題是我無法處理錯誤以回退到另一個傳輸。兩者都.fail()沒有.error()被呼叫。Try-catch 也無濟於事。

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 中有一個未解決的問題。

引用自:https://stackoverflow.com/questions/44612867