ASP.NET में उपयोगकर्ता का क्लाइंट IP पता कैसे प्राप्त करें?


387

हमें Request.UserHostAddressASP.NET में IP एड्रेस प्राप्त करना है, लेकिन यह आमतौर पर उपयोगकर्ता का ISP का IP पता होता है, न कि उपयोगकर्ता के मशीन IP पते का, जो उदाहरण के लिए एक लिंक पर क्लिक करता है। मैं वास्तविक आईपी पता कैसे प्राप्त कर सकता हूं?

उदाहरण के लिए, एक स्टैक ओवरफ्लो उपयोगकर्ता प्रोफ़ाइल में यह है: "अंतिम खाता गतिविधि: 86.123.127.8 से 4 घंटे पहले" , लेकिन मेरी मशीन आईपी पता थोड़ा अलग है। स्टैक ओवरफ्लो को यह पता कैसे मिलता है?

कुछ वेब सिस्टम में कुछ उद्देश्यों के लिए एक आईपी एड्रेस की जाँच होती है। उदाहरण के लिए, एक निश्चित आईपी पते के साथ, प्रत्येक 24 घंटों के लिए उपयोगकर्ता के पास डाउनलोड लिंक पर केवल 5 क्लिक हो सकते हैं? यह IP पता विशिष्ट होना चाहिए, न कि ISP के लिए जिसके पास क्लाइंट या इंटरनेट उपयोगकर्ताओं की एक विशाल श्रृंखला है।

क्या मैं अच्छी तरह से समझ गया था?


4
वे आमतौर पर एक ही काम करते हैं और साझा आईपी पते के लिए सही ढंग से काम नहीं करते हैं। इस क्षेत्र में बहुत कुछ नहीं किया जा सकता है।
मेहरदाद अफश्री

आप यहां क्या समस्या हल करने की कोशिश कर रहे हैं, आपको क्यों लगता है कि आपको आईपी पते की आवश्यकता है?
स्टीव

3
मेरे पास एक एप्लिकेशन है जो एक विशिष्ट लिंक क्लिक्स की जांच करता है, और एक विशिष्ट उपयोगकर्ता (आईपी द्वारा) एक दिन में 5 बार से अधिक लिंक पर क्लिक नहीं कर सकता है। प्रतीक यह है कि यदि Request.UserHostAddress उपयोगकर्ताओं की श्रेणी के लिए ISP या नेटवर्क के अंतर्गत है या एक विशिष्ट उपयोगकर्ता का?
मेहदी

जवाबों:


142

जैसा कि दूसरों ने कहा है कि आप वह नहीं कर सकते जो आप पूछ रहे हैं। यदि आप उस समस्या का वर्णन करते हैं जिसे आप हल करने की कोशिश कर रहे हैं तो शायद कोई मदद कर सकता है?

उदाहरण के लिए

  • क्या आप अपने उपयोगकर्ताओं की विशिष्ट पहचान करने की कोशिश कर रहे हैं?
  • क्या आप IP पते के बजाय कुकी या सत्र ID का उपयोग कर सकते हैं?

संपादित करेंसर्वर पर आपके द्वारा देखा जाने वाला पता ISP का पता नहीं होना चाहिए, क्योंकि आप कहते हैं कि यह एक बड़ी रेंज होगी। ब्रॉडबैंड पर होम उपयोगकर्ता के लिए पता उनके राउटर पर पता होगा, इसलिए घर के अंदर प्रत्येक डिवाइस बाहर की तरफ एक समान दिखाई देगा, लेकिन राउटर NAT का उपयोग यह सुनिश्चित करने के लिए करता है कि ट्रैफ़िक को प्रत्येक डिवाइस पर सही तरीके से रूट किया गया है। कार्यालय के वातावरण से अभिगमन करने वाले उपयोगकर्ताओं के लिए पता सभी उपयोगकर्ताओं के लिए समान हो सकता है। आईडी के लिए आईपी पते का उपयोग करने वाली साइटें इसे बहुत गलत होने का जोखिम उठाती हैं - आपके द्वारा दिए गए उदाहरण अच्छे हैं और वे अक्सर विफल होते हैं। उदाहरण के लिए मेरा कार्यालय यूके में है, ब्रेकआउट पॉइंट (जहां मैं इंटरनेट पर "प्रकट" हूं) दूसरे देश में है जहां हमारी मुख्य आईटी सुविधा है, इसलिए मेरे कार्यालय से मेरा आईपी पता यूके में नहीं लगता है। इस कारण से मैं केवल वेब सामग्री पर यूके नहीं पहुँच सकता, जैसे कि बीबीसी iPlayer)। किसी भी समय मेरी कंपनी के सैकड़ों, या हजारों लोग होंगे, जो एक ही आईपी पते से वेब एक्सेस कर रहे हैं।

जब आप सर्वर कोड लिख रहे हैं तो आप कभी भी निश्चित नहीं हो सकते हैं कि आप जो आईपी एड्रेस देख रहे हैं वह क्या है। कुछ उपयोगकर्ता इसे इस तरह से पसंद करते हैं। कुछ लोग जानबूझकर आपको आगे बढ़ाने के लिए प्रॉक्सी या वीपीएन का उपयोग करते हैं।

जब आप कहते हैं कि आपका मशीन पता StackOverflow पर दिखाए गए आईपी पते से भिन्न है, तो आप अपने मशीन का पता कैसे लगा रहे हैं? यदि आप बस स्थानीय रूप से उपयोग कर रहे हैं ipconfigया ऐसा कुछ कर रहे हैं , तो मैं यह अपेक्षा करूंगा कि मैं ऊपर उल्लिखित कारणों के लिए अलग होऊं। यदि आप यह देखना चाहते हैं कि बाहरी दुनिया क्या सोचती है, तो whatismyipaddress.com/ पर एक नज़र डालते हैं

NAT पर यह विकिपीडिया लिंक आपको इस पर कुछ पृष्ठभूमि प्रदान करेगा।


इसलिए मैंने सर्वर साइड एप्लिकेशन में समझा कि हम आईपी पते के बारे में निश्चित नहीं हैं। इसका मतलब है कि क्लाइंट साइड प्रोग्रामिंग समाधान है ?? आप कुछ जावास्क्रिप्ट कोड के साथ उदाहरण के लिए मतलब है कि हम क्या कर सकते हैं ??
मेहंदी

11
नहीं, यह व्यर्थ होगा, आईपी पता क्लाइंट "सोचता है" यह घर या कार्यालय के लिए आंतरिक होगा, यह बाहरी दुनिया में अर्थहीन होगा। उदाहरण के लिए, अधिकांश घरेलू राउटर 192.168.1.xxx में आईपी पते को सौंप देते हैं, इसलिए हजारों मशीनों का अपने नेटवर्क पर एक ही पता होता है।
स्टीव

12
नहीं, यह अद्वितीय नहीं है। NAT का उपयोग करने वाले एक ही राउटर के पीछे दो उपयोगकर्ताओं के समान IP पता होगा। मुझे वास्तव में लगता है कि आपको इस पर पढ़ने की जरूरत है, मेरे संपादन में लिंक देखें।
स्टीव

1
तो क्यों AWS, Azure आदि जैसी कंपनियाँ सुरक्षा समूह के नियमों में IP पते का उपयोग करती हैं और केवल उस IP-पते को VM से कनेक्ट करने की अनुमति देती हैं?

2
@ user5950947: क्योंकि Azure आपको एक स्थिर सार्वजनिक IP पते वाली कंपनी होने की उम्मीद करता है। यह मान लेना सुरक्षित है कि आपकी कंपनी कभी भी अपने सार्वजनिक आईपी पते से ही एक्सेस करेगी, इसलिए यह एक अच्छा जोड़ा गया सुरक्षा फीचर है। लेकिन आईपी पते को फेक किया जा सकता है या आपके नेटवर्क को हैक किया जा सकता है, इसलिए यह कभी भी सुरक्षा नहीं होनी चाहिए।
डीनतोवो

449

अक्सर आप अपनी वेबसाइट पर आने वाले किसी व्यक्ति का आईपी पता जानना चाहेंगे। जबकि ASP.NET के पास ऐसा करने के कई तरीके हैं, जो हमने देखा है, वह है ServerVariables संग्रह के "HTTP_X_FORWARDED_FOR" का उपयोग करके।

यहाँ पर क्यों...

कभी-कभी आपके आगंतुक प्रॉक्सी सर्वर या राउटर के पीछे होते हैं और मानक Request.UserHostAddressकेवल प्रॉक्सी सर्वर या राउटर के आईपी पते को पकड़ता है। जब यह मामला होता है तो उपयोगकर्ता का आईपी पता सर्वर चर ("HTTP_X_FORWARDED_FOR") में संग्रहीत किया जाता है।

इसलिए हम जो करना चाहते हैं, वह पहले "HTTP_X_FORWARDED_FOR" चेक करें और अगर वह खाली है तो हम बस वापस आ जाएंगे ServerVariables("REMOTE_ADDR")

हालांकि यह तरीका मूर्खतापूर्ण नहीं है, लेकिन यह बेहतर परिणाम दे सकता है। जेम्स क्रॉली के ब्लॉग पोस्ट "गोचचा: HTTP_X_FORWARDED_FOR द्वारा कई IP पते लौटाए गए" से नीचे VB.NET में ASP.NET कोड है।

सी#

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
सुरक्षा उद्देश्यों के लिए इस कोड का उपयोग न करें क्योंकि कोई भी HTTP_X_FORWARDED_FOR या इसी तरह के शीर्ष लेख नकली कर सकता है। इसलिए यदि आप सुरक्षा संबंधित लॉगिंग या सुरक्षा जांच के लिए इसका उपयोग करते हैं, तो एक हमलावर इसे आसानी से बायपास कर सकता है।
डॉ। बुराई

4
आपके लिंक से what we actually needed to be doing was take the last IP address, लेकिन आपका कोड पहले मिलता है addresses[0]। क्या सही है?
नेल्सन रॉदरमेल

4
@NelsonRothermel en.wikipedia.org/wiki/X-Forwarded-For#Format के आधार पर यदि आप क्लाइंट (पिछले प्रॉक्सी के बजाय) चाहते हैं तो पहले का उपयोग करें ।
रिचर्ड

4
@ dr.evil तो आप इसके बजाय क्या प्रस्ताव देंगे? क्योंकि मैं निर्दिष्ट IP द्वारा WCF सेवाओं के लिए पहुँच सेट करना चाहता हूँ।
krypru

7
addresses.Length != 0यह आवश्यक नहीं है, क्योंकि यह कभी भी 0. नहीं हो सकता है
जेम्स विल्किंस

78

अद्यतन: ब्रूनो लोपेज के लिए धन्यवाद। यदि कई आईपी पते आ सकते हैं तो इस पद्धति का उपयोग करने की आवश्यकता है:

    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
जैसा कि एक अन्य उत्तर में कहा गया है, HTTP_X_FORWARDED_FOR अल्पविराम द्वारा अलग किए गए IP की सूची हो सकती है।
ब्रूनो लोप्स

फ़ंक्शन के जवाब में मुझे हर बार :: 1 ही मिलता है। क्या मुझे पूरा आईपी पता नहीं मिल सकता है ???
१६:१६

1
यह स्थानीय होस्ट पर :: 1 लौटेगा। इसे प्रोडक्टिनो वातावरण पर आज़माएं और यह ठीक होना चाहिए।
बेनी मार्गालिट

1
@farhangdon, निम्न कोड स्थानीय होस्ट में आईपी पता लौटाएगा जैसा कि @Bat_Programmer ने नीचे लिखा हैSystem.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList[1].ToString();
बेनी मार्गालिट

यह मत करो! सावधान रहें कि सूची में पहले आईपी पते का उपयोग न करें। आपको केवल मध्य-पूर्व हमलों और हेडर स्पूफिंग से बचने के लिए सबसे सही प्रविष्टि पर शुरू होने वाले ज्ञात आईपी को छोड़ना चाहिए।
जेपी

24

अगर c # इस तरह से देखें, तो बहुत सरल है

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

8
यदि दोनों सर्वर चर शून्य हो सकते हैं, तो यह अपवाद फेंक सकता है।
माइकल फ्रीजिम

यहाँ अनुरोध सन्दर्भ क्या है? I ServerVariables नहीं मिला
ब्राउनबर्गर 11

23

आप उपयोगकर्ता के आईपी पते को और क्या मानते हैं? यदि आप नेटवर्क एडेप्टर का आईपी पता चाहते हैं, तो मुझे डर है कि वेब ऐप में ऐसा करने का कोई संभावित तरीका नहीं है। यदि आपका उपयोगकर्ता NAT या अन्य सामान के पीछे है, तो आप IP प्राप्त नहीं कर सकते।

अद्यतन : जबकि वेब साइटें हैं जो उपयोगकर्ता को सीमित करने के लिए आईपी का उपयोग करती हैं (जैसे रैपिडशेयर), वे एनएटी वातावरण में सही ढंग से काम नहीं करते हैं।


22

मुझे लगता है कि मुझे अपना अनुभव आप सभी के साथ साझा करना चाहिए। वैसे मैं कुछ स्थितियों में देखता हूं REMOTE_ADDR आपको वह नहीं मिलेगा जो आप खोज रहे हैं। उदाहरण के लिए, यदि आपके पास दृश्य के पीछे एक लोड बैलेंसर है और यदि आप क्लाइंट का आईपी प्राप्त करने की कोशिश कर रहे हैं तो आप मुश्किल में पड़ जाएंगे। मैंने अपने आईपी मास्किंग सॉफ्टवेयर के साथ इसकी जाँच की और साथ ही मैंने अपने सहयोगियों के साथ विभिन्न महाद्वीपों में जाँच की। तो यहाँ मेरा समाधान है।

जब मैं एक ग्राहक का आईपी जानना चाहता हूं, तो मैं हर संभव सबूत लेने की कोशिश करता हूं ताकि मैं यह निर्धारित कर सकूं कि क्या वे अद्वितीय हैं:

यहां मुझे एक और सीरियस-वर्जन मिला है जो क्लाइंट साइड का सटीक आईपी प्राप्त करने के लिए आप सभी की मदद कर सकता है। इसलिए मैं उपयोग कर रहा हूं: HTTP_X_CLUSTER_CLIENT_IP

HTTP_X_CLUSTER_CLIENT_IP आपको हमेशा क्लाइंट का सटीक IP मिलता है। किसी भी स्थिति में यदि इसका मूल्य आपको नहीं दे रहा है, तो आपको HTTP_X_FORWARDED_FOR की तलाश करनी चाहिए क्योंकि यह आपको क्लाइंट IP प्राप्त करने के लिए दूसरा सबसे अच्छा उम्मीदवार है और फिर REMOTE_ADDR संस्करण जो आपको IP लौटा सकता है या कर सकता है लेकिन मुझे ये सब करने में मदद मिलेगी तीन वही है जो मुझे उनकी निगरानी के लिए सबसे अच्छी बात लगती है।

मुझे उम्मीद है कि इससे कुछ लोगों को मदद मिलेगी।


यह कहने की जरूरत है कि http_x _... हेडर आसानी से रिमोट_ड्रेड वेरिएबल के संबंध में खराब हो सकते हैं। और इसलिए Remote_addr क्लाइंट आईपी पते के लिए सबसे विश्वसनीय स्रोत बना हुआ है।
Ciro Corvino

1
@CiroCorvino आप सही हैं लेकिन जब आपकी वेबसाइट पर एक सर्वर होस्ट किया गया है जो लोड बैलेंसर के पीछे चल रहा है (जैसा कि मैंने अपनी पोस्ट में पहले ही उल्लेख किया है) तो रिमोट_एडड्रॉप आपको आईपी देता है जिसे आप ढूंढ रहे हैं। मैंने अनुभव किया है कि आप क्या कह रहे हैं, लेकिन जब मैंने समाधान में डुबकी लगाई है जो मैंने कहा है कि मेरे लिए सबसे अच्छा काम करता है।
केएमएक्स

क्षमा करें @KMX, वास्तव में मैं अनुरोध की उत्पत्ति के बारे में कुछ मान्यताओं का अनुमान लगाने के लिए दूरदराज के_दादर और http_x_forwarded के संयोजन का उपयोग करता हूं। यदि आप अपनी पोस्ट को संपादित करते हैं, तो मैं अपना वोट अपडेट करता हूं
Ciro Corvino

15

आप उपयोग कर सकते हैं:

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

1
धन्यवाद, मेरे लिए यह एकमात्र तरीका है जो स्थानीय होस्ट पर वास्तव में मेरा आईपी लौटाता है।
बेनी मार्गालिट

वास्तव में मैंने स्थानीय होस्ट आईपी एड्रेस प्राप्त करने के लिए जो उपयोग किया है वह हैSystem.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList[1].ToString();
बेनी मार्गालिट

1
यह कोड केवल मेरे लिए काम करता है और मैं क्रमशः GetValue (0) और GetValue (1) का उपयोग करके IPv6 और IPv4 प्राप्त करने में सक्षम हूं। धन्यवाद!
राज बराल

हालाँकि, मुझे यह याद करते हुए एक त्रुटि हो रही है कि फिडल में Request for the permission of type 'System.Net.DnsPermission, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
vibs2006

ओपी पूछ रहा है कि रिमोट वेब उपयोगकर्ता का आईपी कैसे प्राप्त किया जाए, न कि स्वयं के स्थानीयहोस्ट का पता।
t.durden

13

आईपी ​​पते "सात-परत स्टैक" में नेटवर्क परत का हिस्सा हैं। नेटवर्क लेयर वह कर सकता है जो वह आईपी एड्रेस से करना चाहता है। प्रॉक्सी सर्वर, NAT, रिले या जो कुछ भी होता है, वही होता है।

एप्लिकेशन परत किसी भी तरह से आईपी पते पर निर्भर नहीं होनी चाहिए। विशेष रूप से, एक आईपी पते का अर्थ नेटवर्क कनेक्शन के एक छोर के ईडेनफिटियर के अलावा किसी अन्य चीज की पहचान करने वाला नहीं है। जैसे ही कोई कनेक्शन बंद होता है, आपको आईपी पते (उसी उपयोगकर्ता के) को बदलने की उम्मीद करनी चाहिए।


1
यह सब अच्छी तरह से और अच्छा है, लेकिन आप क्या करते हैं जब एक बहु-किरायेदार प्रणाली का एक ग्राहक मांग करता है कि उनके उपयोगकर्ताओं के खाते केवल एक निर्दिष्ट आईपी पते से लॉगिन कर सकते हैं?
रॉनी ओवरबी

1
फिर उन्हें आपको बताना होगा कि आपका सर्वर कौन सा आईपी एड्रेस देखेगा। यदि उन्हें वहां एक विशेष पते की आवश्यकता होती है, तो वे एक NAT या इसी तरह के पीछे नहीं रह पाएंगे।
जॉन सॉन्डर्स

@RonnieOverby मैं उसी स्थिति में हूं। मुझे यह जानना होगा कि वे किस आईपी से जुड़ रहे हैं और यह मेरे श्वेतसूची पर होना चाहिए। फिर ऐप उनके आईपी के आधार पर कुछ कार्यक्षमता को चालू या बंद कर सकता है। ग्राहक यही चाहता है।
t.durden

10

अब तक की सभी प्रतिक्रियाओं में गैर-मानकीकृत, लेकिन बहुत सामान्य, X-Forwarded-Forहेडर खाते हैं । एक मानकीकृत Forwardedहेडर है जिसे पार्स करना थोड़ा अधिक कठिन है। कुछ उदाहरण इस प्रकार हैं:

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

मैंने एक वर्ग लिखा है जो क्लाइंट के आईपी पते का निर्धारण करते समय इन दोनों हेडरों को ध्यान में रखता है।

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;
        }
    }
}

नीचे कुछ इकाई परीक्षण दिए गए हैं जिनका उपयोग मैंने अपने समाधान को मान्य करने के लिए किया था:

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

यदि आप CloudFlare का उपयोग कर रहे हैं, तो आप इस एक्सटेंशन विधि को आज़मा सकते हैं :

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;
    }
}

फिर

string IPAddress = Request.GetIPAddress();

और F5 या पालो ऑल्टो का उपयोग कर रहे हैं?
किकेनेट

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

7

आप क्या कर सकते हैं अपने उपयोगकर्ता के राउटर आईपी को स्टोर करें और अग्रेषित आईपी को भी और दोनों आईपी [बाहरी सार्वजनिक और आंतरिक निजी] का उपयोग करके इसे विश्वसनीय बनाने का प्रयास करें। लेकिन फिर से कुछ दिनों के बाद क्लाइंट को राउटर से नया आंतरिक आईपी सौंपा जा सकता है लेकिन यह अधिक विश्वसनीय होगा।


5

@Tony और @mangokun से उत्तरों को मिलाकर , मैंने निम्नलिखित एक्सटेंशन विधि बनाई है:

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;
    }
}

आप उपयोग क्यों करते हैं HTTP_X_FORWARDED_FORलेकिन नहीं X_FORWARDED_FOR? क्या यह वही है?
इगोर यालोवॉय

3

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();
                }
            }
        }
    }
}

उपयोग;

string _ip = this.GetClientIP();

0

यह आसान है।

var remoteIpAddress = Request.HttpContext.Connection.RemoteIpAddress;

अभी यह :))


1
FYI करें, उपरोक्त कोड केवल Asp.Net Core में काम करता है न कि नियमित Asp.Net लिंक पर
Dobin

-1

नमस्कार दोस्तों अधिकांश कोड आपको मिल जाएंगे आप सर्वर आईपी एड्रेस को क्लाइंट आईपी एड्रेस नहीं लौटाएंगे। जब भी यह कोड सही क्लाइंट आईपी एड्रेस देता है। इसे आज़माएं। अधिक जानकारी के लिए बस इसे जांचें

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

जावास्क्रिप्ट का उपयोग करके अपने स्थानीय आईपी पते को प्राप्त करने के लिए आप इस कोड को अपने स्क्रिप्ट टैग के अंदर डाल सकते हैं

<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>

और अपना सार्वजनिक आईपी पता प्राप्त करने के लिए आप इस कोड को अपने स्क्रिप्ट टैग के अंदर डाल सकते हैं

  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

प्रयत्न:

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;
}

यह सर्वर आईपी पता
श्रीकुमार पी

यह asp.net के बारे में है, जो एक वेब अनुप्रयोग है, जो उपयोगकर्ताओं के कंप्यूटर पर नहीं, बल्कि सर्वर पर चलता है।
डॉकमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.