从负载均衡器后面的 DefaultHubCallerContext 获取 Ip

Getting Ip from DefaultHubCallerContext behind a load balancer

我有一个带有 SignalR 集线器的 .Net 5 应用程序,我想从“X-forwarded-for”获取客户端的 IP。 我的应用程序位于负载均衡器后面,因此始终获取 RemoteIpAddress returns 一个 10.x.x.x Ip.

从 HubCallerContext 开始,我可以从其功能中获取 IHttpConnectionFeature

var httpReq = Context.Features.Get<IHttpConnectionFeature>();

并且在调试时我可以看到 object 包含一个 RequestHeader,但我只能访问 LocalIpAddressRemoteIpAddressLocalPortConnectionId.

调用 httpReq.RequestHeaders 不允许我编译应用程序。

有没有办法从 IHttpConnectionFeatureDefaultHubCallerContext 中获取 headers?

您可以使用 Microsoft.AspNetCore.Builder.ForwardedHeadersExtensions 中的中间件 IApplicationBuilder#UseForwardedHeaders

只要所有代理都正确更新 header X-Forwarded-For 并且选项正确(我们必须硬编码代理或告​​诉 IP/network 我们可以信任)。

在您的 Startup.cs 中,将以下中间件添加到 Configure 方法中:

app.UseForwardedHeaders();

然后在ConfigureServices中你要配置它:

services.Configure<ForwardedHeadersOptions>(options =>
{
 ...
});

有关选项的更多信息,请参阅:https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-6.0#forwarded-headers-middleware-options