ASP.NET Core 中使用负责均衡时获取客户端 IP
Posted dudu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET Core 中使用负责均衡时获取客户端 IP相关的知识,希望对你有一定的参考价值。
在使用负载均衡的情况下,通过 context.Connection.RemoteIpAddress 获取到的是负载均衡的 IP 地址,需要通过 X-Forwarded-For 请求头才能获取到客户端的真实 IP 。
之前采用的方式是自己直接获取 X-Forwarded-For 请求头,代码如下:
public static class HttpContextExtensions public static string GetUserIp(this HttpContext context) var ip = context.Request.Headers["X-Forwarded-For"].FirstOrDefault(); if (string.IsNullOrEmpty(ip)) ip = context.Connection.RemoteIpAddress?.ToString(); return GetSingleIP(ip); private static string GetSingleIP(string ip) if (!string.IsNullOrEmpty(ip)) var commaIndex = ip.LastIndexOf(","); if (commaIndex >= 0) ip = ip.Substring(commaIndex + 1); return ip;
现在改用 asp.net core 内置的 Forwarded Headers Middleware 来实现。
先在 Startup.ConfigureServices 中配置 ForwardedHeadersOptions ,对于获取客户端 IP 的场景只需要指定 ForwardedHeaders.XForwardedFor 。
services.Configure<ForwardedHeadersOptions>(options => options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; options.KnownNetworks.Clear(); options.KnownProxies.Clear(); );
注:如果负载均衡不是在本机通过 Loopback 地址转发请求的,一定要加上 options.KnownNetworks.Clear 与 options.KnownProxies.Clear 。
然后在 Startup.Configure 中添加 Forwarded Headers 中间件。
app.UseForwardedHeaders()
这样就可以通过 RemoteIpAddress 获取客户端的真实 IP 地址了。
var ip = Request.HttpContext.Connection.RemoteIpAddress?.MapToIPv4().ToString();
以上是关于ASP.NET Core 中使用负责均衡时获取客户端 IP的主要内容,如果未能解决你的问题,请参考以下文章
当服务器位于 AWS ELB 之后时,ASP.NET Core MVC 应用程序如何获取客户端 IP 地址?
在 ASP.NET Core 2.2 中获取客户端的 IP 地址
在 ASP.NET CORE Web API 中获取客户端 IP 地址有问题吗?