Làm thế nào để có được địa chỉ IP máy khách của người dùng trong ASP.NET?


387

Chúng ta phải Request.UserHostAddresslấy địa chỉ IP trong ASP.NET, nhưng đây thường là địa chỉ IP của ISP của người dùng, không chính xác là địa chỉ IP của máy người dùng, ví dụ như đã nhấp vào một liên kết. Làm thế nào tôi có thể có được Địa chỉ IP thực?

Ví dụ: trong hồ sơ người dùng Stack Overflow, đó là: "Hoạt động tài khoản cuối cùng: 4 giờ trước từ 86.123.127.8" , nhưng địa chỉ IP máy của tôi hơi khác một chút. Làm thế nào để Stack Overflow có được địa chỉ này?

Trong một số hệ thống web có kiểm tra địa chỉ IP cho một số mục đích. Ví dụ: với một địa chỉ IP nhất định, cứ sau 24 giờ, người dùng có thể chỉ có 5 lần nhấp vào liên kết tải xuống không? Địa chỉ IP này phải là duy nhất, không dành cho ISP có nhiều khách hàng hoặc người dùng Internet.

Tôi đã hiểu rõ chưa?


4
Họ thường làm điều tương tự và không hoạt động chính xác cho các địa chỉ IP được chia sẻ. Không có nhiều có thể được thực hiện trong lĩnh vực này.
Mehrdad Afshari

Vấn đề bạn đang cố gắng giải quyết ở đây là gì, tại sao bạn nghĩ rằng bạn cần địa chỉ IP?
Steve

3
Tôi có một ứng dụng kiểm tra một lần nhấp liên kết cụ thể và một người dùng cụ thể (theo IP) không thể nhấp vào liên kết hơn 5 lần trong một ngày. Vấn đề là nếu Request.UserhostAddress dành cho nhiều người dùng Theo ISP hoặc Mạng hoặc một người dùng cụ thể?
Mehdi

Câu trả lời:


142

Như những người khác đã nói bạn không thể làm những gì bạn đang yêu cầu. Nếu bạn mô tả vấn đề bạn đang cố gắng giải quyết có lẽ ai đó có thể giúp đỡ?

Ví dụ

  • bạn đang cố gắng xác định duy nhất người dùng của bạn?
  • Bạn có thể sử dụng cookie hoặc ID phiên có thể thay vì địa chỉ IP không?

Biên tậpĐịa chỉ bạn thấy trên máy chủ không nên là địa chỉ của ISP, như bạn nói đó sẽ là một phạm vi rất lớn. Địa chỉ cho người dùng gia đình trên băng thông rộng sẽ là địa chỉ tại bộ định tuyến của họ, vì vậy mọi thiết bị trong nhà sẽ xuất hiện ở bên ngoài giống nhau, nhưng bộ định tuyến sử dụng NAT để đảm bảo lưu lượng truy cập được định tuyến chính xác đến từng thiết bị. Đối với người dùng truy cập từ môi trường văn phòng, địa chỉ có thể giống nhau cho tất cả người dùng. Các trang web sử dụng địa chỉ IP cho ID có nguy cơ bị sai rất nhiều - ví dụ bạn đưa ra là những trang tốt và chúng thường thất bại. Ví dụ: văn phòng của tôi ở Vương quốc Anh, điểm đột phá (nơi tôi "xuất hiện" trên internet) là ở một quốc gia khác có cơ sở CNTT chính của chúng tôi, vì vậy từ văn phòng của tôi, địa chỉ IP của tôi dường như không phải ở Anh. Vì lý do này, tôi không thể truy cập nội dung web chỉ ở Vương quốc Anh, chẳng hạn như BBC iPlayer). Tại bất kỳ thời điểm nào cũng sẽ có hàng trăm, thậm chí hàng nghìn người trong công ty tôi dường như đang truy cập web từ cùng một địa chỉ IP.

Khi bạn đang viết mã máy chủ, bạn không bao giờ có thể chắc chắn địa chỉ IP bạn thấy đang đề cập đến. Một số người dùng thích nó theo cách này. Một số người cố tình sử dụng proxy hoặc VPN để khiến bạn bối rối hơn nữa.

Khi bạn nói địa chỉ máy của bạn khác với địa chỉ IP được hiển thị trên StackOverflow, làm thế nào bạn tìm ra địa chỉ máy của bạn? Nếu bạn chỉ tìm kiếm sử dụng tại địa phương ipconfighoặc một cái gì đó tương tự, tôi sẽ mong đợi nó sẽ khác đi vì những lý do tôi đã nêu ở trên. Nếu bạn muốn kiểm tra lại những gì thế giới bên ngoài nghĩ, hãy xem whatismyipaddress.com/ .

Liên kết Wikipedia này trên NAT sẽ cung cấp cho bạn một số nền tảng về điều này.


Vì vậy, tôi hiểu trong các ứng dụng phía máy chủ, chúng tôi không thể chắc chắn về địa chỉ IP. nó có nghĩa là lập trình phía khách hàng là giải pháp ?? ý bạn là ví dụ với một số mã JavaScript chúng ta có thể làm điều đó ??
Mehdi

12
KHÔNG, điều này sẽ là vô nghĩa, địa chỉ IP mà khách hàng "nghĩ" nó sẽ là nội bộ đối với nhà hoặc văn phòng, nó sẽ là vô nghĩa trong thế giới bên ngoài. Ví dụ: hầu hết các bộ định tuyến gia đình đều phát các địa chỉ IP trong phạm vi 192.168.1.xxx, vì vậy hàng ngàn máy có cùng địa chỉ trên các mạng riêng của chúng.
Steve

12
Không, nó không phải là duy nhất. Hai người dùng đằng sau cùng một bộ định tuyến sử dụng NAT sẽ có cùng địa chỉ IP. Tôi thực sự nghĩ rằng bạn cần phải đọc lên về điều này, xem liên kết trong chỉnh sửa của tôi.
Steve

1
Vậy tại sao các công ty như AWS, Azure, vv lại sử dụng địa chỉ IP trong các quy tắc nhóm bảo mật và chỉ cho phép địa chỉ IP đó kết nối với VM?

2
@ user5950947: Bởi vì Azure mong muốn bạn trở thành một công ty có địa chỉ IP công cộng tĩnh. Sẽ an toàn khi cho rằng công ty của bạn sẽ chỉ truy cập từ địa chỉ IP công cộng của nó, vì vậy đây là một tính năng bảo mật được thêm vào tốt đẹp. Nhưng địa chỉ IP có thể bị làm giả hoặc mạng của bạn có thể bị hack, vì vậy nó không bao giờ là bảo mật duy nhất.
Deantwo

449

Thường thì bạn sẽ muốn biết địa chỉ IP của ai đó đang truy cập trang web của bạn. Mặc dù ASP.NET có một số cách để thực hiện điều này, một trong những cách tốt nhất mà chúng tôi đã thấy là bằng cách sử dụng "HTTP_X_FORWARDED_FOR" của bộ sưu tập ServerVariables.

Đây là lý do tại sao...

Đôi khi khách truy cập của bạn đứng sau máy chủ proxy hoặc bộ định tuyến và tiêu chuẩn Request.UserHostAddresschỉ nắm bắt địa chỉ IP của máy chủ proxy hoặc bộ định tuyến. Khi gặp trường hợp này, địa chỉ IP của người dùng sẽ được lưu trong biến máy chủ ("HTTP_X_FORWARDED_FOR").

Vì vậy, những gì chúng tôi muốn làm trước tiên là kiểm tra "HTTP_X_FORWARDED_FOR" và nếu đó là trống, chúng tôi chỉ cần quay lại ServerVariables("REMOTE_ADDR").

Mặc dù phương pháp này không thể đánh lừa được, nhưng nó có thể dẫn đến kết quả tốt hơn. Dưới đây là mã ASP.NET trong VB.NET, được lấy từ bài đăng trên blog của James Crowley "Gotcha: HTTP_X_FORWARDED_FOR trả về nhiều địa chỉ IP"

C #

protected string GetIPAddress()
{
    System.Web.HttpContext context = System.Web.HttpContext.Current; 
    string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

    if (!string.IsNullOrEmpty(ipAddress))
    {
        string[] addresses = ipAddress.Split(',');
        if (addresses.Length != 0)
        {
            return addresses[0];
        }
    }

    return context.Request.ServerVariables["REMOTE_ADDR"];
}

VB.NET

Public Shared Function GetIPAddress() As String
    Dim context As System.Web.HttpContext = System.Web.HttpContext.Current
    Dim sIPAddress As String = context.Request.ServerVariables("HTTP_X_FORWARDED_FOR")
    If String.IsNullOrEmpty(sIPAddress) Then
        Return context.Request.ServerVariables("REMOTE_ADDR")
    Else
        Dim ipArray As String() = sIPAddress.Split(New [Char]() {","c})
        Return ipArray(0)
    End If
End Function

24
Đảm bảo không sử dụng mã này cho mục đích bảo mật vì bất kỳ ai cũng có thể giả mạo HTTP_X_FORWARDED_FOR hoặc các tiêu đề tương tự. Vì vậy, nếu bạn sử dụng điều này để ghi nhật ký hoặc kiểm tra bảo mật liên quan đến bảo mật, kẻ tấn công có thể vượt qua nó một cách dễ dàng.
dr. ác

4
Từ liên kết của bạn what we actually needed to be doing was take the last IP address, nhưng mã của bạn được đầu tiên addresses[0]. Cái nào đúng?
Nelson Rothermel

4
@NelsonRothermel Dựa trên en.wikipedia.org/wiki/X-Forwarded-For#Format nếu bạn muốn các khách hàng (chứ không phải proxy trước) sau đó sử dụng đầu tiên .
Richard

4
@ dr.evil Vậy bạn sẽ đề xuất gì thay thế? Bởi vì tôi muốn đặt quyền truy cập cho các dịch vụ WCF theo các IP được chỉ định.
krypru

7
addresses.Length != 0là không cần thiết, vì nó không bao giờ có thể là 0.
James Wilkins

78

CẬP NHẬT: Cảm ơn Bruno Lopes. Nếu một số địa chỉ IP có thể đến thì cần phải sử dụng phương pháp này:

    private string GetUserIP()
    {
        string ipList = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

        if (!string.IsNullOrEmpty(ipList))
        {
            return ipList.Split(',')[0];
        }

        return Request.ServerVariables["REMOTE_ADDR"];
    }

3
Như đã lưu ý trong các câu trả lời khác, HTTP_X_FORWARDED_FOR có thể là một danh sách các IP, được phân tách bằng dấu phẩy.
Bruno Lopes

Đáp lại chức năng tôi chỉ nhận được :: 1 lần. Tôi không thể có được địa chỉ IP đầy đủ ???
farhangdon

1
nó sẽ trả về :: 1 trên máy chủ cục bộ. Hãy thử nó trên môi trường Productino và nó sẽ ổn thôi.
Benny Margalit

1
@farhangdon, đoạn mã sau sẽ trả về địa chỉ IP trong máy chủ cục bộ như @Bat_Programmer đã viết bên dướiSystem.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList[1].ToString();
Benny Margalit

ĐỪNG LÀM ĐIỀU NÀY! Hãy cẩn thận không chỉ đơn giản là sử dụng địa chỉ IP đầu tiên trong danh sách. Bạn chỉ nên bỏ qua các IP proxy đã biết bắt đầu ở mục ngoài cùng bên phải để tránh các cuộc tấn công trung gian và giả mạo tiêu đề.
Jpsy

24

Nếu là c # xem theo cách này, thì rất đơn giản

string clientIp = (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? 
                   Request.ServerVariables["REMOTE_ADDR"]).Split(',')[0].Trim();

8
Nếu cả hai biến máy chủ có thể là null, nó có thể ném ngoại lệ.
Michael Freidgeim

Yêu cầu Tham khảo ở đây là gì? Tôi không tìm thấy máy chủ
Brownbagger11

23

Những gì khác bạn xem xét địa chỉ IP người dùng? Nếu bạn muốn địa chỉ IP của bộ điều hợp mạng, tôi e rằng không có cách nào có thể thực hiện được trong ứng dụng Web. Nếu người dùng của bạn đứng sau NAT hoặc những thứ khác, bạn cũng không thể có được IP.

Cập nhật : Mặc dù có các trang web sử dụng IP để giới hạn người dùng (như Rapidshare), nhưng chúng không hoạt động chính xác trong môi trường NAT.


22

Tôi nghĩ rằng tôi nên chia sẻ kinh nghiệm của tôi với tất cả các bạn. Vâng, tôi thấy trong một số tình huống, REMOTE_ADDR sẽ không giúp bạn có được thứ bạn đang tìm kiếm. Chẳng hạn, nếu bạn có Load Balancer đằng sau hậu trường và nếu bạn đang cố lấy IP của Client thì bạn sẽ gặp rắc rối. Tôi đã kiểm tra nó bằng phần mềm mặt nạ IP của mình và tôi cũng đã kiểm tra với các đồng nghiệp của mình ở các châu lục khác nhau. Vì vậy, đây là giải pháp của tôi.

Khi tôi muốn biết IP của khách hàng, tôi cố gắng chọn mọi bằng chứng có thể để tôi có thể xác định xem chúng có phải là duy nhất không:

Ở đây tôi đã tìm thấy một sever-var khác có thể giúp tất cả các bạn nếu bạn muốn lấy IP chính xác của phía máy khách. vì vậy tôi đang sử dụng: HTTP_X_CLUSTER_CLIENT_IP

HTTP_X_CLUSTER_CLIENT_IP luôn cung cấp cho bạn IP chính xác của máy khách. Trong mọi trường hợp nếu nó không mang lại cho bạn giá trị, thì bạn nên tìm HTTP_X_FORWARDED_FOR vì đây là ứng cử viên tốt thứ hai để lấy IP của khách hàng và sau đó là var REMOTE_ADDR có thể trả lại cho bạn IP nhưng với tôi có tất cả những thứ này ba là những gì tôi tìm thấy điều tốt nhất để theo dõi họ.

Tôi hy vọng điều này sẽ giúp một số kẻ.


Cần phải nói rằng các tiêu đề http_x _... có thể dễ dàng bị giả mạo đối với biến remote_addr. Và do đó remote_addr vẫn là nguồn đáng tin cậy nhất cho địa chỉ IP của máy khách.
Ciro Corvino

1
@CiroCorvino bạn đúng nhưng khi trang web của bạn được lưu trữ trên một máy chủ đang chạy phía sau Load Balancer (như tôi đã đề cập trong bài đăng của tôi) thì remote_addr sẽ không cung cấp cho bạn IP mà bạn đang tìm kiếm. Tôi đã trải nghiệm những gì bạn đang nói nhưng khi tôi tìm hiểu về giải pháp, những gì tôi đã nêu là phù hợp nhất với tôi.
KMX

Xin lỗi @KMX, thực tế tôi cũng sử dụng kết hợp remote_addr và http_x_forwarded để suy ra một số giả định về nguồn gốc của yêu cầu. Nếu bạn chỉnh sửa bài đăng của mình, tôi sẽ cập nhật phiếu bầu của mình
Ciro Corvino

15

Bạn có thể dùng:

System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList.GetValue(0).ToString();

1
cảm ơn, đối với tôi đây là phương pháp duy nhất thực sự trả lại IP của tôi trên máy chủ cục bộ.
Benny Margalit

Trên thực tế những gì tôi đã sử dụng để có được địa chỉ IP máy chủ lưu trữ cục bộ làSystem.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList[1].ToString();
Benny Margalit

1
Mã này chỉ hoạt động với tôi và tôi có thể nhận IPv6 và IPv4 bằng cách sử dụng GetValue (0) và GetValue (1) tương ứng. Cảm ơn Upvote!
Raj Baral

Tuy nhiên, tôi đang gặp lỗi trong khi thực hiện điều đó trong fiddle Request for the permission of type 'System.Net.DnsPermission, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
vibs2006

OP hỏi làm thế nào để có được IP của người dùng web từ xa, không phải địa chỉ của localhost của anh ấy.
t.durden

13

Địa chỉ IP là một phần của lớp Mạng trong "ngăn xếp bảy lớp". Lớp Mạng có thể làm bất cứ điều gì nó muốn làm với địa chỉ IP. Đó là những gì xảy ra với một máy chủ proxy, NAT, chuyển tiếp hoặc bất cứ điều gì.

Lớp Ứng dụng không nên phụ thuộc vào địa chỉ IP theo bất kỳ cách nào. Cụ thể, Địa chỉ IP không có nghĩa là một định danh của bất kỳ thứ gì khác ngoài idenfitier của một đầu của kết nối mạng. Ngay sau khi kết nối được đóng lại, bạn nên mong đợi địa chỉ IP (của cùng một người dùng) sẽ thay đổi.


1
Điều đó rất tốt và tốt, nhưng bạn sẽ làm gì khi một khách hàng của hệ thống nhiều người thuê yêu cầu tài khoản người dùng của họ chỉ có thể đăng nhập từ một địa chỉ IP được chỉ định?
Ronnie Overby

1
Sau đó, họ phải cho bạn biết địa chỉ IP mà máy chủ của bạn sẽ nhìn thấy. Nếu họ cần có một địa chỉ cụ thể, thì họ sẽ không thể đứng sau NAT hoặc tương tự.
John Saunders

@RonnieOverby Tôi cũng ở trong tình trạng tương tự. Tôi cần biết họ đang kết nối IP từ đâu và nó phải nằm trong danh sách trắng của tôi. Sau đó, ứng dụng có thể bật hoặc tắt chức năng nhất định dựa trên IP của họ. Đây là những gì khách hàng muốn.
t.durden

10

Tất cả các phản hồi cho đến nay đều tính đến tiêu đề không chuẩn, nhưng rất phổ biến X-Forwarded-For. Có một tiêu Forwardedđề được chuẩn hóa , khó phân tích hơn một chút. Một số ví dụ như sau:

Forwarded: for="_gazonk"
Forwarded: For="[2001:db8:cafe::17]:4711"
Forwarded: for=192.0.2.60;proto=http;by=203.0.113.43
Forwarded: for=192.0.2.43, for=198.51.100.17

Tôi đã viết một lớp đưa cả hai tiêu đề này vào tài khoản khi xác định địa chỉ IP của khách hàng.

using System;
using System.Web;

namespace Util
{
    public static class IP
    {
        public static string GetIPAddress()
        {
            return GetIPAddress(new HttpRequestWrapper(HttpContext.Current.Request));
        }

        internal static string GetIPAddress(HttpRequestBase request)
        {
            // handle standardized 'Forwarded' header
            string forwarded = request.Headers["Forwarded"];
            if (!String.IsNullOrEmpty(forwarded))
            {
                foreach (string segment in forwarded.Split(',')[0].Split(';'))
                {
                    string[] pair = segment.Trim().Split('=');
                    if (pair.Length == 2 && pair[0].Equals("for", StringComparison.OrdinalIgnoreCase))
                    {
                        string ip = pair[1].Trim('"');

                        // IPv6 addresses are always enclosed in square brackets
                        int left = ip.IndexOf('['), right = ip.IndexOf(']');
                        if (left == 0 && right > 0)
                        {
                            return ip.Substring(1, right - 1);
                        }

                        // strip port of IPv4 addresses
                        int colon = ip.IndexOf(':');
                        if (colon != -1)
                        {
                            return ip.Substring(0, colon);
                        }

                        // this will return IPv4, "unknown", and obfuscated addresses
                        return ip;
                    }
                }
            }

            // handle non-standardized 'X-Forwarded-For' header
            string xForwardedFor = request.Headers["X-Forwarded-For"];
            if (!String.IsNullOrEmpty(xForwardedFor))
            {
                return xForwardedFor.Split(',')[0];
            }

            return request.UserHostAddress;
        }
    }
}

Dưới đây là một số bài kiểm tra đơn vị mà tôi đã sử dụng để xác thực giải pháp của mình:

using System.Collections.Specialized;
using System.Web;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UtilTests
{
    [TestClass]
    public class IPTests
    {
        [TestMethod]
        public void TestForwardedObfuscated()
        {
            var request = new HttpRequestMock("for=\"_gazonk\"");
            Assert.AreEqual("_gazonk", Util.IP.GetIPAddress(request));
        }

        [TestMethod]
        public void TestForwardedIPv6()
        {
            var request = new HttpRequestMock("For=\"[2001:db8:cafe::17]:4711\"");
            Assert.AreEqual("2001:db8:cafe::17", Util.IP.GetIPAddress(request));
        }

        [TestMethod]
        public void TestForwardedIPv4()
        {
            var request = new HttpRequestMock("for=192.0.2.60;proto=http;by=203.0.113.43");
            Assert.AreEqual("192.0.2.60", Util.IP.GetIPAddress(request));
        }

        [TestMethod]
        public void TestForwardedIPv4WithPort()
        {
            var request = new HttpRequestMock("for=192.0.2.60:443;proto=http;by=203.0.113.43");
            Assert.AreEqual("192.0.2.60", Util.IP.GetIPAddress(request));
        }

        [TestMethod]
        public void TestForwardedMultiple()
        {
            var request = new HttpRequestMock("for=192.0.2.43, for=198.51.100.17");
            Assert.AreEqual("192.0.2.43", Util.IP.GetIPAddress(request));
        }
    }

    public class HttpRequestMock : HttpRequestBase
    {
        private NameValueCollection headers = new NameValueCollection();

        public HttpRequestMock(string forwarded)
        {
            headers["Forwarded"] = forwarded;
        }

        public override NameValueCollection Headers
        {
            get { return this.headers; }
        }
    }
}

9

Nếu bạn đang sử dụng CloudFlare, bạn có thể thử Phương thức tiện ích mở rộng này :

public static class IPhelper
{
    public static string GetIPAddress(this HttpRequest Request)
    {
        if (Request.Headers["CF-CONNECTING-IP"] != null) return Request.Headers["CF-CONNECTING-IP"].ToString();

        if (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null) return Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();

        return Request.UserHostAddress;
    }
}

sau đó

string IPAddress = Request.GetIPAddress();

Và sử dụng F5 hay Palo Alto?
Kiquenet

8
string IP = HttpContext.Current.Request.Params["HTTP_CLIENT_IP"] ?? HttpContext.Current.Request.UserHostAddress;

7

Những gì bạn có thể làm là lưu trữ IP bộ định tuyến của người dùng và cả IP được chuyển tiếp và cố gắng làm cho nó đáng tin cậy bằng cả hai IP [Công khai bên ngoài và Riêng tư nội bộ]. Nhưng một lần nữa sau một số ngày khách hàng có thể được chỉ định IP nội bộ mới từ bộ định tuyến nhưng nó sẽ đáng tin cậy hơn.


5

Kết hợp các câu trả lời từ @Tony@mangokun , tôi đã tạo ra phương thức mở rộng sau:

public static class RequestExtensions
{
    public static string GetIPAddress(this HttpRequest Request)
    {
        if (Request.Headers["CF-CONNECTING-IP"] != null) return Request.Headers["CF-CONNECTING-IP"].ToString();

        if (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null)
        {
            string ipAddress = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

            if (!string.IsNullOrEmpty(ipAddress))
            {
                string[] addresses = ipAddress.Split(',');
                if (addresses.Length != 0)
                {
                    return addresses[0];
                }
            }
        }

        return Request.UserHostAddress;
    }
}

Tại sao bạn sử dụng HTTP_X_FORWARDED_FORnhưng không X_FORWARDED_FOR? Họ có giống nhau không?
Igor Yalovoy

3

sử dụng trong tập tin ashx

public string getIP(HttpContext c)
{
    string ips = c.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
    if (!string.IsNullOrEmpty(ips))
    {
        return ips.Split(',')[0];
    }
    return c.Request.ServerVariables["REMOTE_ADDR"];
}

2
public static class Utility
{
    public static string GetClientIP(this System.Web.UI.Page page)
    {
        string _ipList = page.Request.Headers["CF-CONNECTING-IP"].ToString();
        if (!string.IsNullOrWhiteSpace(_ipList))
        {
            return _ipList.Split(',')[0].Trim();
        }
        else
        {
            _ipList = page.Request.ServerVariables["HTTP_X_CLUSTER_CLIENT_IP"];
            if (!string.IsNullOrWhiteSpace(_ipList))
            {
                return _ipList.Split(',')[0].Trim();
            }
            else
            {
                _ipList = page.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
                if (!string.IsNullOrWhiteSpace(_ipList))
                {
                    return _ipList.Split(',')[0].Trim();
                }
                else
                {
                    return page.Request.ServerVariables["REMOTE_ADDR"].ToString().Trim();
                }
            }
        }
    }
}

Sử dụng;

string _ip = this.GetClientIP();

0

Thật dễ dàng. Hãy thử nó:

var remoteIpAddress = Request.HttpContext.Connection.RemoteIpAddress;

chỉ nó thôi :))


1
FYI, đoạn mã trên chỉ hoạt động trong Asp.Net Core chứ không phải liên kết
Dobin

-1

Xin chào các bạn Hầu hết các mã bạn sẽ tìm thấy sẽ trả về cho bạn địa chỉ IP của máy chủ chứ không phải địa chỉ IP của máy khách. Dù sao mã này cũng trả về địa chỉ IP của máy khách chính xác. Hãy thử. Để biết thêm thông tin chỉ cần kiểm tra này

https://www.youtube.com/watch?v=Nkf37DsxYjI

để nhận địa chỉ IP cục bộ của bạn bằng javascript, bạn có thể sử dụng đặt mã này vào trong thẻ script của mình

<script>
    var RTCPeerConnection = /*window.RTCPeerConnection ||*/
     window.webkitRTCPeerConnection || window.mozRTCPeerConnection;

         if (RTCPeerConnection) (function () {
             var rtc = new RTCPeerConnection({ iceServers: [] });
             if (1 || window.mozRTCPeerConnection) {      
                 rtc.createDataChannel('', { reliable: false });
             };

             rtc.onicecandidate = function (evt) {

                 if (evt.candidate)
                     grepSDP("a=" + evt.candidate.candidate);
             };
             rtc.createOffer(function (offerDesc) {
                 grepSDP(offerDesc.sdp);
                 rtc.setLocalDescription(offerDesc);
             }, function (e) { console.warn("offer failed", e); });


             var addrs = Object.create(null);
             addrs["0.0.0.0"] = false;
             function updateDisplay(newAddr) {
                 if (newAddr in addrs) return;
                 else addrs[newAddr] = true;
                 var displayAddrs = Object.keys(addrs).filter(function
(k) { return addrs[k]; });
                 document.getElementById('list').textContent =
displayAddrs.join(" or perhaps ") || "n/a";
             }

             function grepSDP(sdp) {
                 var hosts = [];
                 sdp.split('\r\n').forEach(function (line) { 
                     if (~line.indexOf("a=candidate")) {   
                         var parts = line.split(' '),   
                             addr = parts[4],
                             type = parts[7];
                         if (type === 'host') updateDisplay(addr);
                     } else if (~line.indexOf("c=")) {      
                         var parts = line.split(' '),
                             addr = parts[2];
                         updateDisplay(addr);
                     }
                 });
             }
         })(); else
         {
             document.getElementById('list').innerHTML = "<code>ifconfig| grep inet | grep -v inet6 | cut -d\" \" -f2 | tail -n1</code>";
             document.getElementById('list').nextSibling.textContent = "In Chrome and Firefox your IP should display automatically, by the power of WebRTCskull.";

         }




</script>
<body>
<div id="list"></div>
</body>

và Để nhận địa chỉ IP công khai của bạn, bạn có thể sử dụng đặt mã này vào trong thẻ script của mình

  function getIP(json) {
    document.write("My public IP address is: ", json.ip);
  }


<script type="application/javascript" src="https://api.ipify.org?format=jsonp&callback=getIP"></script>


-7

Thử:

using System.Net;

public static string GetIpAddress()  // Get IP Address
{
    string ip = "";     
    IPHostEntry ipEntry = Dns.GetHostEntry(GetCompCode());
    IPAddress[] addr = ipEntry.AddressList;
    ip = addr[2].ToString();
    return ip;
}
public static string GetCompCode()  // Get Computer Name
{   
    string strHostName = "";
    strHostName = Dns.GetHostName();
    return strHostName;
}

Điều này trả về địa chỉ IP của máy chủ
Saletumar P

Đó là về asp.net, một ứng dụng web, chạy trên máy chủ, không phải trên máy tính của người dùng.
doekman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.