SignalR 使用 401 要求提供身份验证凭据

5 c# asp.net ntlm http-status-code-401 signalr

我有一个带有 MVC、Web API 和 SignalR 并使用 Windows 身份验证的 .Net 4.5 网站。一切运行良好,直到我将集线器添加到我的 HTML 中:

@Scripts.Render("~/signalr/hubs")
Run Code Online (Sandbox Code Playgroud)

有了这条线,大约有 1/3 的时间,当我按 F5 刷新页面时,在页面加载之前,我会收到用户名/密码提示。这有时只影响集线器,有时会影响一些 MVC 视图,有时会影响整个页面。我有这个Startup.cs:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.SetDefaultSignInAsAuthenticationType(NtlmAuthenticationDefaults.AuthenticationType);
        app.UseNtlmAuthentication();
        app.MapSignalR(new HubConfiguration()
        {
            EnableDetailedErrors = true,
            EnableJSONP = true
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

在web.config:

<authentication mode="Windows" />
<authorization>
    <deny users="?" />
</authorization>
Run Code Online (Sandbox Code Playgroud)

我注意到在 Fiddler 中请求 hubs.js 有一个Authorization: Negotiate ...标头。紧随其后的是第二个请求,也是针对 hub.js,使用Authorization: Negotiate ...,但哈希值不同。

有谁知道为什么会发生这种情况以及如何解决它?可根据要求提供其他诊断信息。请注意,我实际上并没有连接到 SignalR 集线器。此时我正在做的就是加载集线器 JS。

  • 信号R:2.2.0
  • Microsoft.Owin.Host.SystemWeb:3.0.1
  • Pysco68.Owin.Authentication.Ntlm:1.0.2

这似乎只发生在 Chrome 上。到目前为止,IE 一直运行良好。

编辑:当我关闭 Fiddler 时,问题完全消失。 那么现在问题变成了:为什么MVC、SignalR和Fiddler的组合会破坏Ntlm?如果我卸下集线器,它就可以工作。如果我关闭 Fiddler,它会起作用。什么?

swe*_*ner 1

看起来提琴手无法协商身份验证。我的猜测是动态代理需要根据您的 web.config 进行身份验证。

最简单的解决方案是在作曲家的选项选项卡下打开 fiddlers 自动验证。