Dans le cas de l'équilibrage de charge, l'adresse IP de l'équilibrage de charge est obtenue via context.Connection.RemoteIpAddress, et l'adresse IP réelle du client doit être obtenue via l'en-tête de requête X-Forwarded-For.
La méthode précédente consiste à obtenir directement l'en-tête de requête X-Forwarded-For par vous-même, le code est le suivant :
public static class HttpContextExtensions { public static string GetUserIp (ce contexte HttpContext) { var ip = context.Request.Headers["X-Forwarded-For"].FirstOrDefault(); if (string.IsNullOrEmpty(ip)) { ip = context.Connection.RemoteIpAddress?.ToString(); } renvoie GetSingleIP(ip); } chaîne statique privée GetSingleIP(string ip) { if (!string.IsNullOrEmpty(ip)) { var commaIndex = ip.LastIndexOf(","); if (commaIndex >= 0) { ip = ip.Substring(commaIndex + 1); } } renvoie ip ; } }
Utilisez maintenant le middleware d'en-têtes transférés intégré du noyau asp.net pour y parvenir.
Configurez d'abord ForwardedHeadersOptions dans Startup.ConfigureServices et n'avez besoin de spécifier que ForwardedHeaders.XForwardedFor pour le scénario d'obtention de l'adresse IP du client.
services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; options.KnownNetworks.Clear(); options.KnownProxies.Clear(); });
Remarque 1 : si l'équilibrage de charge ne transfère pas les requêtes via l'adresse de bouclage sur la machine locale, options.KnownNetworks.Clear et options.KnownProxies.Clear doivent être ajoutés.
Remarque 2 : Si la variable d'environnement ASPNETCORE_FORWARDEDHEADERS_ENABLED est définie sur true, le code de configuration ci-dessus n'est pas nécessaire.
Ajoutez ensuite le middleware Forwarded Headers dans Startup.Configure.
app.UseForwardedHeaders()
De cette manière, la véritable adresse IP du client peut être obtenue via RemoteIpAddress.
var ip = Request.HttpContext.Connection.RemoteIpAddress?.MapToIPv4().ToString();