SignalR无法与Windows集成的身份验证一起使用

时间:2017-06-18 07:55:29

标签: asp.net websocket signalr windows-authentication ntlm

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

只要我将应用更改为Windows集成身份验证(“{。1}”在“web.config”中),它就会停止工作。

  

jquery.signalR-2.2.2.min.js:9 <authentication mode="Windows"/>的WebSocket连接失败: WebSocket握手期间出错:意外响应代码:403

ws://localhost:51030/signalr/connect?transport=webSockets&blhablahblah属性添加到我的集线器后,错误将更改为

  

[Authorize]的WebSocket连接失败:HTTP身份验证失败;没有有效的凭证

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

我该如何解决?

如果由于某种原因它无法解决(可能是Chrome不支持在websocket连接上使用windows auth或其他东西) - 为什么它不回归到非websocket协议?以及如何我会强制退回吗?

更新:我创建了一个github问题https://github.com/SignalR/SignalR/issues/3953。问题不在于我无法连接。问题是我无法处理错误以回退到另一个传输。不会调用ws://localhost:51030/signalr/connect?transport=webSocketsblahblah而不是.fail()。 Try-catch也没有帮助。

2 个答案:

答案 0 :(得分:9)

... 10小时后......

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

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

您还可以通过调用:

指定哪个传输回传
$.connection.hub.start( { transport: ['webSockets', 'longPolling'] });

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

原因

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

如果有人想要向Chromium开发者添加任何输入,那么Chromium bugtracker中有一个未解决的问题https://bugs.chromium.org/p/chromium/issues/detail?id=423609

答案 1 :(得分:3)

我也遇到了这个错误,但只有在使用http进行本地开发时才会出现这种情况。我认为Chrome不喜欢不安全的ws://连接。一旦我使用安全https连接部署到服务器,WebSocket连接就升级到wss://,Chrome停止抱怨,与WebSockets一起工作正常 - 没有必要回退到其他传输。

TL:博士;请务必使用https为您的网站。