Kita harus Request.UserHostAddress
mendapatkan alamat IP di ASP.NET, tetapi ini biasanya alamat IP ISP pengguna, bukan alamat IP mesin pengguna yang misalnya mengklik tautan. Bagaimana saya bisa mendapatkan Alamat IP asli?
Misalnya, dalam profil pengguna Stack Overflow, itu adalah: "Aktivitas akun terakhir: 4 jam yang lalu dari 86.123.127.8" , tetapi alamat IP mesin saya agak berbeda. Bagaimana cara Stack Overflow mendapatkan alamat ini?
Dalam beberapa sistem web ada pemeriksaan alamat IP untuk beberapa tujuan. Misalnya, dengan alamat IP tertentu, untuk setiap 24 jam dapatkah pengguna hanya memiliki 5 klik pada tautan unduhan? Alamat IP ini harus unik, bukan untuk ISP yang memiliki banyak klien atau pengguna Internet.
Apakah saya mengerti dengan baik?
sumber
Jawaban:
Seperti yang orang lain katakan, Anda tidak bisa melakukan apa yang Anda minta. Jika Anda menggambarkan masalah yang Anda coba selesaikan, mungkin seseorang dapat membantu?
Misalnya
EditAlamat yang Anda lihat di server tidak boleh menjadi alamat ISP, seperti yang Anda katakan itu akan menjadi sangat banyak. Alamat untuk pengguna rumahan pada broadband akan menjadi alamat di router mereka, sehingga setiap perangkat di dalam rumah akan tampak di luar sama, tetapi router menggunakan NAT untuk memastikan bahwa lalu lintas diarahkan ke setiap perangkat dengan benar. Untuk pengguna yang mengakses dari lingkungan kantor alamatnya mungkin sama untuk semua pengguna. Situs yang menggunakan alamat IP untuk ID menjalankan risiko salah besar - contoh yang Anda berikan adalah yang baik dan sering gagal. Misalnya kantor saya di Inggris, titik pelarian (tempat saya "nampak" berada di internet) adalah di negara lain tempat fasilitas TI utama kami, jadi dari kantor saya alamat IP saya tampaknya bukan di Inggris. Untuk alasan ini saya tidak dapat mengakses konten web UK saja, seperti BBC iPlayer). Pada waktu tertentu akan ada ratusan, atau bahkan ribuan orang di perusahaan saya yang tampaknya mengakses web dari alamat IP yang sama.
Saat Anda menulis kode server, Anda tidak pernah bisa memastikan apa yang merujuk ke alamat IP yang Anda lihat. Beberapa pengguna menyukainya dengan cara ini. Beberapa orang sengaja menggunakan proxy atau VPN untuk lebih mengacaukan Anda.
Ketika Anda mengatakan alamat mesin Anda berbeda dengan alamat IP yang ditunjukkan pada StackOverflow, bagaimana Anda mengetahui alamat mesin Anda? Jika Anda hanya mencari secara lokal menggunakan
ipconfig
atau sesuatu seperti itu saya harapkan itu berbeda karena alasan yang saya uraikan di atas. Jika Anda ingin mengecek apa yang dunia luar pikirkan, lihat whatismyipaddress.com/ .Tautan Wikipedia ini tentang NAT akan memberi Anda beberapa latar belakang tentang hal ini.
sumber
Seringkali Anda ingin mengetahui alamat IP seseorang yang mengunjungi situs web Anda. Sementara ASP.NET memiliki beberapa cara untuk melakukan ini, salah satu cara terbaik yang kami lihat adalah dengan menggunakan "HTTP_X_FORWARDED_FOR" dari koleksi ServerVariables.
Inilah sebabnya ...
Terkadang pengunjung Anda berada di belakang server proxy atau router dan standar
Request.UserHostAddress
hanya menangkap alamat IP dari server proxy atau router. Ketika hal ini terjadi, alamat IP pengguna kemudian disimpan dalam variabel server ("HTTP_X_FORWARDED_FOR").Jadi yang ingin kita lakukan adalah pertama-tama memeriksa "HTTP_X_FORWARDED_FOR" dan jika itu kosong, kita cukup kembali
ServerVariables("REMOTE_ADDR")
.Meskipun metode ini tidak mudah, ini dapat menghasilkan hasil yang lebih baik. Di bawah ini adalah kode ASP.NET di VB.NET, diambil dari posting blog James Crowley "Gotcha: HTTP_X_FORWARDED_FOR mengembalikan beberapa alamat IP"
C #
VB.NET
sumber
what we actually needed to be doing was take the last IP address
,, tetapi kode Anda yang pertamaaddresses[0]
. Yang mana yang benar?addresses.Length != 0
tidak perlu, karena itu tidak pernah bisa 0.UPDATE: Terima kasih kepada Bruno Lopes. Jika beberapa alamat ip bisa datang maka perlu menggunakan metode ini:
sumber
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList[1].ToString();
Jika c # lihat dengan cara ini, sangat sederhana
sumber
Apa lagi yang Anda anggap sebagai alamat IP pengguna? Jika Anda ingin alamat IP adaptor jaringan, saya khawatir tidak ada cara yang mungkin untuk melakukannya di aplikasi Web. Jika pengguna Anda berada di belakang NAT atau hal lain, Anda juga tidak bisa mendapatkan IP.
Pembaruan : Meskipun ada situs Web yang menggunakan IP untuk membatasi pengguna (seperti rapidshare), mereka tidak berfungsi dengan benar di lingkungan NAT.
sumber
Saya pikir saya harus berbagi pengalaman saya dengan Anda semua. Yah saya melihat dalam beberapa situasi REMOTE_ADDR TIDAK akan memberi Anda apa yang Anda cari. Misalnya, jika Anda memiliki Load Balancer di belakang layar dan jika Anda mencoba untuk mendapatkan IP Klien maka Anda akan berada dalam masalah. Saya memeriksanya dengan perangkat lunak IP masking saya dan saya juga memeriksa dengan kolega saya berada di benua yang berbeda. Jadi, inilah solusi saya.
Ketika saya ingin mengetahui IP klien, saya mencoba memilih setiap bukti yang mungkin sehingga saya bisa menentukan apakah mereka unik:
Di sini saya menemukan beberapa sever yang dapat membantu Anda semua jika Anda ingin mendapatkan IP yang tepat dari sisi klien. jadi saya menggunakan: HTTP_X_CLUSTER_CLIENT_IP
HTTP_X_CLUSTER_CLIENT_IP selalu memberi Anda IP yang tepat dari klien. Dalam hal apa pun jika tidak memberikan Anda nilai, Anda harus mencari HTTP_X_FORWARDED_FOR karena itu adalah kandidat terbaik kedua untuk mendapatkan IP klien dan var REMOTE_ADDR yang mungkin atau mungkin tidak mengembalikan IP Anda tetapi kepada saya memiliki semua ini tiga adalah apa yang saya temukan untuk memantau mereka.
Saya harap ini membantu beberapa orang.
sumber
Kamu bisa menggunakan:
sumber
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList[1].ToString();
Request for the permission of type 'System.Net.DnsPermission, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
Alamat IP adalah bagian dari lapisan Jaringan dalam "tumpukan tujuh lapisan". Lapisan Jaringan dapat melakukan apa pun yang ingin dilakukan dengan alamat IP. Itulah yang terjadi dengan server proxy, NAT, relay, atau apa pun.
Lapisan Aplikasi tidak boleh bergantung pada alamat IP dengan cara apa pun. Secara khusus, Alamat IP tidak dimaksudkan untuk menjadi pengidentifikasi apa pun selain pengenal dari satu ujung koneksi jaringan. Segera setelah koneksi ditutup, Anda harus mengharapkan alamat IP (dari pengguna yang sama) berubah.
sumber
Semua tanggapan sejauh ini memperhitungkan tajuk yang tidak terstandarisasi, tetapi sangat umum
X-Forwarded-For
. AdaForwarded
header standar yang sedikit lebih sulit untuk diuraikan. Beberapa contoh adalah sebagai berikut:Saya telah menulis sebuah kelas yang memperhitungkan kedua header ini saat menentukan alamat IP klien.
Di bawah ini adalah beberapa unit test yang saya gunakan untuk memvalidasi solusi saya:
sumber
Jika Anda menggunakan CloudFlare, Anda dapat mencoba Metode Ekstensi ini :
kemudian
sumber
sumber
Yang dapat Anda lakukan adalah menyimpan IP router dari pengguna Anda dan juga IP yang diteruskan dan mencoba membuatnya andal menggunakan kedua IP [External Public dan Internal Private]. Tetapi sekali lagi setelah beberapa hari klien dapat ditugaskan IP internal baru dari router tetapi akan lebih dapat diandalkan.
sumber
Menggabungkan jawaban dari @Tony dan @mokokun , saya telah membuat metode ekstensi berikut:
sumber
HTTP_X_FORWARDED_FOR
tetapi tidakX_FORWARDED_FOR
? Apakah mereka sama?gunakan dalam file ashx
sumber
Menggunakan;
sumber
Itu mudah. Coba saja:
hanya itu :))
sumber
Halo teman-teman Sebagian besar kode yang Anda temukan akan mengembalikan alamat ip server Anda bukan alamat ip klien. Namun, kode ini mengembalikan alamat ip klien yang benar. Cobalah. Untuk info lebih lanjut, periksa ini
https://www.youtube.com/watch?v=Nkf37DsxYjI
untuk mendapatkan alamat ip lokal Anda menggunakan javascript Anda dapat menggunakan memasukkan kode ini di dalam tag skrip Anda
dan Untuk mendapatkan alamat ip publik Anda, Anda dapat menggunakan memasukkan kode ini di dalam tag skrip Anda
sumber
Gunakan ini
sumber
Mencoba:
sumber