Bạn có thể vui lòng cho tôi biết cách lấy địa chỉ IP của máy khách trong ASP.NET khi sử dụng MVC 6. Request.ServerVariables["REMOTE_ADDR"]
không hoạt động.
Bạn có thể vui lòng cho tôi biết cách lấy địa chỉ IP của máy khách trong ASP.NET khi sử dụng MVC 6. Request.ServerVariables["REMOTE_ADDR"]
không hoạt động.
Câu trả lời:
API đã được cập nhật. Không chắc chắn khi nó thay đổi nhưng theo Damien Edwards vào cuối tháng 12, bây giờ bạn có thể làm điều này:
var remoteIpAddress = request.HttpContext.Connection.RemoteIpAddress;
RemoteIpAddress
này luôn luôn null
dành cho tôi, khi tôi xuất bản trang web của anh ấy trên IIS và đăng nhập nó trên một tập tin.
Trong project.json thêm một phụ thuộc vào:
"Microsoft.AspNetCore.HttpOverrides": "1.0.0"
Trong Startup.cs
, trong Configure()
phương thức thêm:
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor |
ForwardedHeaders.XForwardedProto
});
Và tất nhiên:
using Microsoft.AspNetCore.HttpOverrides;
Sau đó, tôi có thể nhận được ip bằng cách sử dụng:
Request.HttpContext.Connection.RemoteIpAddress
Trong trường hợp của tôi, khi gỡ lỗi trong VS tôi luôn nhận được IpV6 localhost, nhưng khi được triển khai trên IIS tôi luôn nhận được IP từ xa.
Một số liên kết hữu ích: Làm thế nào để tôi có được địa chỉ IP của máy khách trong ASP.NET CORE? và RemoteIpAddress luôn là null
Có ::1
thể là do:
Kết thúc kết nối tại IIS, sau đó chuyển tiếp đến Kestrel, máy chủ web v.next, vì vậy các kết nối đến máy chủ web thực sự là từ localhost. ( https://stackoverflow.com/a/35442401/5326387 )
Một số logic dự phòng có thể được thêm vào để xử lý sự hiện diện của Load Balancer.
Ngoài ra, thông qua kiểm tra, X-Forwarded-For
tiêu đề tình cờ vẫn được đặt ngay cả khi không có Load Balancer (có thể do lớp Kestrel bổ sung?):
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);
}
Giả định _httpContextAccessor
được cung cấp thông qua DI.
Bạn có thể sử dụng IHttpConnectionFeature
để có được thông tin này.
var remoteIpAddress = httpContext.GetFeature<IHttpConnectionFeature>()?.RemoteIpAddress;
httpContext.GetFeature<IHttpConnectionFeature>()
luôn luôn là như vậy null
.
Trong ASP.NET 2.1, Trong StartUp.cs Thêm dịch vụ này:
services.AddHttpContextAccessor();
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();
và sau đó làm 3 bước:
Xác định một biến trong bộ điều khiển MVC của bạn
private IHttpContextAccessor _accessor;
DI vào hàm tạo của bộ điều khiển
public SomeController(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
Lấy địa chỉ IP
_accessor.HttpContext.Connection.RemoteIpAddress.ToString()
Đây là cách nó được thực hiện.
::1
là localhost trong IPv6. Tương đương với IPv4 của127.0.0.1
Trong trường hợp của tôi, tôi có Ứng dụng web DotNet Core 2.2 chạy trên DigitalOcean với docker và nginx làm proxy ngược. Với mã này trong Startup.cs tôi có thể lấy IP của máy khách
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 là ip mà tôi đã nhận được trước khi sử dụng
Request.HttpContext.Connection.RemoteIpAddress.ToString();
Đầu tiên, trong .Net Core 1.0 Thêm using Microsoft.AspNetCore.Http.Features;
vào bộ điều khiển Sau đó bên trong phương thức có liên quan:
var ip = HttpContext.Features.Get<IHttpConnectionFeature>()?.RemoteIpAddress?.ToString();
Tôi đã đọc một số câu trả lời khác không biên dịch được vì nó đang sử dụng httpContext chữ thường, dẫn đến việc VS thêm bằng cách sử dụng Microsoft.AspNetCore.Http, thay vì sử dụng thích hợp, hoặc với HTTPContext (trình biên dịch cũng bị đánh lừa).
nhận ipaddress và tên máy chủ trong lõi .net
đặt mã này trong bộ điều khiển
Thực hiện theo các bước sau:
var addlist = Dns.GetHostEntry(Dns.GetHostName());
string GetHostName = addlist.HostName.ToString();
string GetIPV6 = addlist.AddressList[0].ToString();
string GetIPV4 = addlist.AddressList[1].ToString();
Tôi thấy rằng, một số bạn thấy rằng địa chỉ IP bạn nhận được là ::: 1 hoặc 0.0.0.1
Đây là vấn đề do bạn cố gắng lấy IP từ máy của chính mình và sự nhầm lẫn của C # cố gắng trả lại IPv6.
Vì vậy, tôi triển khai câu trả lời từ @Johna ( https://stackoverflow.com/a/41335701/812720 ) và @David ( https://stackoverflow.com/a/8597351/812720 ), Cảm ơn họ!
và ở đây để giải quyết:
thêm Gói Microsoft.AspNetCore.HttpOverrides trong Tài liệu tham khảo của bạn (Phụ thuộc / Gói)
thêm dòng này vào Startup.cs
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
}
để nhận IPAddress, hãy sử dụng mã này trong bất kỳ Trình điều khiển nào của bạn.
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();
}
và bây giờ bạn có thể nhận địa chỉ IPv4 từ remoteIpAddress hoặc kết quả
thử cái này.
var host = Dns.GetHostEntry(Dns.GetHostName());
foreach (var ip in host.AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
ipAddress = ip.ToString();
}
}
Chạy .NET core
(3.1.4) IIS
phía sau bộ cân bằng tải không hoạt động với các giải pháp được đề xuất khác.
Đọc thủ công X-Forwarded-For
tiêu đề nào.
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;
}
Tôi đang chạy một khép kín gói bằng cách sử dụng gói lưu trữ .
Chạy ASP.NET Core 2.1 đằng sau Proxy đảo ngược Traefik trên Ubuntu, tôi cần đặt IP gateway của nó KnownProxies
sau khi cài đặt Microsoft.AspNetCore.HttpOverrides
gói chính thức
var forwardedOptions = new ForwardedHeadersOptions {
ForwardedHeaders = ForwardedHeaders.XForwardedFor,
};
forwardedOptions.KnownProxies.Add(IPAddress.Parse("192.168.3.1"));
app.UseForwardedHeaders(forwardedOptions);
Theo tài liệu , điều này là bắt buộc nếu proxy ngược không chạy trên localhost. Các docker-compose.yml
của Traefik đã gán một địa chỉ IP tĩnh:
networks:
my-docker-network:
ipv4_address: 192.168.3.2
Ngoài ra, nó là đủ để đảm bảo một mạng đã biết được xác định ở đây để chỉ định cổng của nó trong .NET Core.
httpContext.GetFeature<IHttpConnectionFeature>().RemoteIpAddress