gpt4 book ai didi

具有自托管和身份验证的 SignalR 跨域连接

转载 作者:行者123 更新时间:2023-12-03 23:54:26 28 4
gpt4 key购买 nike

我在使用 OWIN 自托管 SignalR 时遇到了 CORS 问题,这仅在我尝试启用身份验证时发生。

我在网络浏览器中遇到的错误是:

XMLHttpRequest cannot load http://.../signalr/negotiate?[snip] Origin ... is not allowed by Access-Control-Allow-Origin



仅当我使用 this answer 中的方法在我的自托管服务器中启用身份验证时才会发生这种情况。 :
public void Configuration(IAppBuilder app)
{
var listener = (HttpListener)app.Properties[typeof(HttpListener).FullName];
listener.AuthenticationSchemes = AuthenticationSchemes.Ntlm;

app.MapHubs(new HubConfiguration { EnableCrossDomain = true });
}

如果我注释掉 AuthenticationSchemes行然后 CORS 工作(我已经检查了 these instructions 中的所有内容)。如果我使用 NTLM 以外的其他身份验证方案,我会遇到同样的问题。

使用 Fiddler 检查发生了什么,没有启用身份验证,我看到从服务器返回的必要 CORS header :

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: [my server]



但是,一旦我启用身份验证,我会得到一个缺少这些 header 的 401 响应。所有请求都有必要的 Origin标题。

检查 SignalR source code看起来正在设置 header ,但大概启用了身份验证 HttpListener正在发送初始的 401 响应而不点击此代码。

所以我想我的问题是:我如何获得 HttpListener包括 Access-Control-Allow-Origin身份验证协议(protocol)协商中的 header ?

最佳答案

通过允许预检请求匿名访问,我已经获得了 NTLM 身份验证以与 OWIN 中自托管的跨域 signalR 一起使用。

需要做的是创建一个委托(delegate)来选择身份验证方案,该方案查找预检请求 header ,并允许这些 header 匿名通过。所有其他请求将使用 NTLM。

public void Configuration(IAppBuilder appBuilder)
{
var listener = (HttpListener)appBuilder.Properties[typeof(HttpListener).FullName];
listener.AuthenticationSchemeSelectorDelegate += AuthenticationSchemeSelectorDelegate;
}

private AuthenticationSchemes AuthenticationSchemeSelectorDelegate(HttpListenerRequest httpRequest)
{
if (httpRequest.Headers.Get("Access-Control-Request-Method")!=null)
return AuthenticationSchemes.Anonymous;
else
return AuthenticationSchemes.Ntlm;
}

关于具有自托管和身份验证的 SignalR 跨域连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17485046/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com