Können Sie bitte lassen Sie mich wissen , wie Adresse Client - IP in ASP.NET zu erhalten , wenn mit MVC 6. Request.ServerVariables["REMOTE_ADDR"]
funktioniert nicht.
Können Sie bitte lassen Sie mich wissen , wie Adresse Client - IP in ASP.NET zu erhalten , wenn mit MVC 6. Request.ServerVariables["REMOTE_ADDR"]
funktioniert nicht.
Antworten:
Die API wurde aktualisiert. Ich bin mir nicht sicher, wann es sich geändert hat, aber laut Damien Edwards Ende Dezember können Sie dies jetzt tun:
var remoteIpAddress = request.HttpContext.Connection.RemoteIpAddress;
RemoteIpAddress
ist immer null
für mich, wenn ich die Website auf IIS veröffentliche und diese in einer Datei protokolliere.
Fügen Sie in project.json eine Abhängigkeit hinzu zu:
"Microsoft.AspNetCore.HttpOverrides": "1.0.0"
In Startup.cs
der Configure()
Methode hinzufügen:
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor |
ForwardedHeaders.XForwardedProto
});
Und natürlich:
using Microsoft.AspNetCore.HttpOverrides;
Dann könnte ich die IP bekommen mit:
Request.HttpContext.Connection.RemoteIpAddress
In meinem Fall bekam ich beim Debuggen in VS immer IpV6 localhost, aber wenn ich auf einem IIS bereitgestellt wurde, bekam ich immer die Remote-IP.
Einige nützliche Links: Wie erhalte ich die Client-IP-Adresse in ASP.NET CORE? und RemoteIpAddress ist immer null
Das ::1
liegt vielleicht an:
Verbindungsbeendigung bei IIS, die dann an Kestrel, den v.next-Webserver, weitergeleitet wird, sodass Verbindungen zum Webserver tatsächlich von localhost erfolgen. ( https://stackoverflow.com/a/35442401/5326387 )
Einige Fallback-Logik kann hinzugefügt werden, um das Vorhandensein eines Load Balancers zu behandeln.
Durch Inspektion wird der X-Forwarded-For
Header auch ohne Load Balancer gesetzt (möglicherweise aufgrund einer zusätzlichen Kestrel-Ebene?):
public string GetRequestIP(bool tryUseXForwardHeader = true)
{
string ip = null;
// todo support new "Forwarded" header (2014) https://en.wikipedia.org/wiki/X-Forwarded-For
// X-Forwarded-For (csv list): Using the First entry in the list seems to work
// for 99% of cases however it has been suggested that a better (although tedious)
// approach might be to read each IP from right to left and use the first public IP.
// http://stackoverflow.com/a/43554000/538763
//
if (tryUseXForwardHeader)
ip = GetHeaderValueAs<string>("X-Forwarded-For").SplitCsv().FirstOrDefault();
// RemoteIpAddress is always null in DNX RC1 Update1 (bug).
if (ip.IsNullOrWhitespace() && _httpContextAccessor.HttpContext?.Connection?.RemoteIpAddress != null)
ip = _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString();
if (ip.IsNullOrWhitespace())
ip = GetHeaderValueAs<string>("REMOTE_ADDR");
// _httpContextAccessor.HttpContext?.Request?.Host this is the local host.
if (ip.IsNullOrWhitespace())
throw new Exception("Unable to determine caller's IP.");
return ip;
}
public T GetHeaderValueAs<T>(string headerName)
{
StringValues values;
if (_httpContextAccessor.HttpContext?.Request?.Headers?.TryGetValue(headerName, out values) ?? false)
{
string rawValues = values.ToString(); // writes out as Csv when there are multiple.
if (!rawValues.IsNullOrWhitespace())
return (T)Convert.ChangeType(values.ToString(), typeof(T));
}
return default(T);
}
public static List<string> SplitCsv(this string csvList, bool nullOrWhitespaceInputReturnsNull = false)
{
if (string.IsNullOrWhiteSpace(csvList))
return nullOrWhitespaceInputReturnsNull ? null : new List<string>();
return csvList
.TrimEnd(',')
.Split(',')
.AsEnumerable<string>()
.Select(s => s.Trim())
.ToList();
}
public static bool IsNullOrWhitespace(this string s)
{
return String.IsNullOrWhiteSpace(s);
}
Angenommen, _httpContextAccessor
wurde durch DI bereitgestellt.
Sie können das verwenden IHttpConnectionFeature
, um diese Informationen zu erhalten.
var remoteIpAddress = httpContext.GetFeature<IHttpConnectionFeature>()?.RemoteIpAddress;
httpContext.GetFeature<IHttpConnectionFeature>()
Sei in meiner Demo immer null
.
Fügen Sie in ASP.NET 2.1 in StartUp.cs diese Dienste hinzu:
services.AddHttpContextAccessor();
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();
und dann 3 Schritte machen:
Definieren Sie eine Variable in Ihrem MVC-Controller
private IHttpContextAccessor _accessor;
DI in den Konstruktor der Steuerung
public SomeController(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
Rufen Sie die IP-Adresse ab
_accessor.HttpContext.Connection.RemoteIpAddress.ToString()
So wird es gemacht.
::1
ist localhost in IPv6. Das IPv4-Äquivalent von127.0.0.1
In meinem Fall läuft DotNet Core 2.2 Web App auf DigitalOcean mit Docker und Nginx als Reverse-Proxy. Mit diesem Code in Startup.cs kann ich die Client-IP erhalten
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.All,
RequireHeaderSymmetry = false,
ForwardLimit = null,
KnownNetworks = { new IPNetwork(IPAddress.Parse("::ffff:172.17.0.1"), 104) }
});
:: ffff: 172.17.0.1 war die IP, die ich vor der Verwendung erhalten habe
Request.HttpContext.Connection.RemoteIpAddress.ToString();
Zuerst in .Net Core 1.0 using Microsoft.AspNetCore.Http.Features;
Zum Controller hinzufügen Dann innerhalb der entsprechenden Methode:
var ip = HttpContext.Features.Get<IHttpConnectionFeature>()?.RemoteIpAddress?.ToString();
Ich habe mehrere andere Antworten gelesen, die nicht kompiliert werden konnten, weil ein httpContext in Kleinbuchstaben verwendet wurde. Dies führte dazu, dass der VS mithilfe von Microsoft.AspNetCore.Http anstelle der entsprechenden Verwendung oder mit HttpContext hinzugefügt wurde (der Compiler ist ebenfalls irreführend).
Holen Sie sich die IP-Adresse und den Hostnamen im .net-Kern
Geben Sie diesen Code in die Steuerung ein
Folge diesen Schritten:
var addlist = Dns.GetHostEntry(Dns.GetHostName());
string GetHostName = addlist.HostName.ToString();
string GetIPV6 = addlist.AddressList[0].ToString();
string GetIPV4 = addlist.AddressList[1].ToString();
Ich habe festgestellt, dass einige von Ihnen festgestellt haben, dass die IP-Adresse, die Sie erhalten, ::: 1 oder 0.0.0.1 ist
Dies ist das Problem, weil Sie versuchen, IP von Ihrem eigenen Computer abzurufen, und die Verwirrung von C #, die versucht, IPv6 zurückzugeben.
Also implementiere ich die Antwort von @Johna ( https://stackoverflow.com/a/41335701/812720 ) und @David ( https://stackoverflow.com/a/8597351/812720 ). Danke an sie!
und hier zur Lösung:
Fügen Sie das Microsoft.AspNetCore.HttpOverrides-Paket in Ihre Referenzen ein (Abhängigkeiten / Pakete).
Fügen Sie diese Zeile in Startup.cs hinzu
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// your current code
// start code to add
// to get ip address
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
// end code to add
}
Verwenden Sie diesen Code in einer Ihrer Controller.cs, um IPAddress zu erhalten
IPAddress remoteIpAddress = Request.HttpContext.Connection.RemoteIpAddress;
string result = "";
if (remoteIpAddress != null)
{
// If we got an IPV6 address, then we need to ask the network for the IPV4 address
// This usually only happens when the browser is on the same machine as the server.
if (remoteIpAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)
{
remoteIpAddress = System.Net.Dns.GetHostEntry(remoteIpAddress).AddressList
.First(x => x.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork);
}
result = remoteIpAddress.ToString();
}
und jetzt können Sie die IPv4-Adresse von remoteIpAddress oder result erhalten
Versuche dies.
var host = Dns.GetHostEntry(Dns.GetHostName());
foreach (var ip in host.AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
ipAddress = ip.ToString();
}
}
Das Ausführen .NET core
(3.1.4) IIS
hinter einem Load Balancer funktionierte nicht mit anderen vorgeschlagenen Lösungen.
Das manuelle Lesen des X-Forwarded-For
Headers funktioniert.
IPAddress ip;
var headers = Request.Headers.ToList();
if (headers.Exists((kvp) => kvp.Key == "X-Forwarded-For"))
{
// when running behind a load balancer you can expect this header
var header = headers.First((kvp) => kvp.Key == "X-Forwarded-For").Value.ToString();
ip = IPAddress.Parse(header);
}
else
{
// this will always have a value (running locally in development won't have the header)
ip = Request.HttpContext.Connection.RemoteIpAddress;
}
Ich verwende ein eigenständiges Paket mit dem Hosting- Paket .
Wenn ich ASP.NET Core 2.1 hinter einem Traefik-Reverse-Proxy unter Ubuntu ausführe, muss ich KnownProxies
nach der Installation des offiziellen Microsoft.AspNetCore.HttpOverrides
Pakets die Gateway-IP festlegen
var forwardedOptions = new ForwardedHeadersOptions {
ForwardedHeaders = ForwardedHeaders.XForwardedFor,
};
forwardedOptions.KnownProxies.Add(IPAddress.Parse("192.168.3.1"));
app.UseForwardedHeaders(forwardedOptions);
Laut Dokumentation ist dies erforderlich, wenn der Reverse-Proxy nicht auf localhost ausgeführt wird. The docker-compose.yml
of Traefik hat eine statische IP-Adresse vergeben:
networks:
my-docker-network:
ipv4_address: 192.168.3.2
Alternativ sollte es ausreichen, sicherzustellen, dass hier ein bekanntes Netzwerk definiert ist, um sein Gateway in .NET Core anzugeben.
httpContext.GetFeature<IHttpConnectionFeature>().RemoteIpAddress