从负载均衡器后面的 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
,但我只能访问 LocalIpAddress
、RemoteIpAddress
、LocalPort
和ConnectionId
.
调用 httpReq.RequestHeaders
不允许我编译应用程序。
有没有办法从 IHttpConnectionFeature
或 DefaultHubCallerContext
中获取 headers?
您可以使用 Microsoft.AspNetCore.Builder.ForwardedHeadersExtensions
中的中间件 IApplicationBuilder#UseForwardedHeaders
。
只要所有代理都正确更新 header X-Forwarded-For
并且选项正确(我们必须硬编码代理或告诉 IP/network 我们可以信任)。
在您的 Startup.cs
中,将以下中间件添加到 Configure
方法中:
app.UseForwardedHeaders();
然后在ConfigureServices
中你要配置它:
services.Configure<ForwardedHeadersOptions>(options =>
{
...
});
我有一个带有 SignalR 集线器的 .Net 5 应用程序,我想从“X-forwarded-for”获取客户端的 IP。 我的应用程序位于负载均衡器后面,因此始终获取 RemoteIpAddress returns 一个 10.x.x.x Ip.
从 HubCallerContext 开始,我可以从其功能中获取 IHttpConnectionFeature
var httpReq = Context.Features.Get<IHttpConnectionFeature>();
并且在调试时我可以看到 object 包含一个 RequestHeader
,但我只能访问 LocalIpAddress
、RemoteIpAddress
、LocalPort
和ConnectionId
.
调用 httpReq.RequestHeaders
不允许我编译应用程序。
有没有办法从 IHttpConnectionFeature
或 DefaultHubCallerContext
中获取 headers?
您可以使用 Microsoft.AspNetCore.Builder.ForwardedHeadersExtensions
中的中间件 IApplicationBuilder#UseForwardedHeaders
。
只要所有代理都正确更新 header X-Forwarded-For
并且选项正确(我们必须硬编码代理或告诉 IP/network 我们可以信任)。
在您的 Startup.cs
中,将以下中间件添加到 Configure
方法中:
app.UseForwardedHeaders();
然后在ConfigureServices
中你要配置它:
services.Configure<ForwardedHeadersOptions>(options =>
{
...
});