2017-07-10 8 views
5

मैं ASP.NET MVC 5. से उपयोगकर्ता के आईपी पते पाने के लिए कोशिश कर रहा हूँ रिटर्न मैं इस तरह के विभिन्न उदाहरणों, ऊपर देखा है:ग्राहक आईपी पते एक ही आंतरिक नेटवर्क पता

वे सभी का उत्पादन किया गया है एक ही परिणाम: उपयोगकर्ता नेटवर्क से आंतरिक माना जाता है। मैंने दोस्तों को अपने फोन की कोशिश की है (जो नेटवर्क पर नहीं हैं)।

private static Logger _logger = LogManager.GetCurrentClassLogger(); 
public static bool IsIpInternal() 
{ 
    var ipAddress = HttpContext.Current.Request.UserHostAddress; 
    var logEvent = new LogEventInfo(LogLevel.Info, _logger.Name, ipAddress); 
    _logger.Log(logEvent); 
    try 
    { 
     if (ipAddress != null) 
     { 
      var ipParts = ipAddress.Split(new[] { "." }, StringSplitOptions.RemoveEmptyEntries) 
       .Select(int.Parse).ToArray(); 
      var isDebug = System.Diagnostics.Debugger.IsAttached; 

      if (ipParts[0] == 10) 
      { 
       return true; 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     logEvent = new LogEventInfo(LogLevel.Error, _logger.Name, e.Message); 
     _logger.Log(logEvent); 
     return false; 
    } 
    return false; 
} 

लॉग सभी अनुरोधों (लॉग के आधार पर) के लिए 10.xxx.xx.xxx दिखा रहा है: यहाँ मेरी नवीनतम प्रयास है। वेब ऐप से कनेक्ट करने वाले क्लाइंट के आईपी की बजाय यह एक आंतरिक पता है। IsIpInternal() हमेशा सत्य देता है। मैं क्या गलत कर रहा हूं?

ध्यान दें कि मैं 192.168.x.x और 172.16.xxx.xxx पते को अनदेखा कर रहा हूं।

+1

क्या आपकी वेबसाइट प्रॉक्सी या लोड बैलेंसर के पीछे है? –

+0

@ जॉन वू, हां, हमारे पास एक साइट्रिक्स नेटस्केकर है जो हमारे सभी सर्वर उपयोग करते हैं। क्या वह मूल आईपी पता हटा सकता है? – Alex

उत्तर

6

यदि आपकी वेबसाइट लोड बैलेंसर के पीछे है, तो लोड बैलेंसर के आईपी पते के लिए यह एक आम समस्या है जब आप क्लाइंट के आईपी पते की अपेक्षा कर रहे हों। ऐसा इसलिए है क्योंकि वास्तविकता में लोड बैलेंसर एकमात्र ग्राहक है जिसे वेब एप्लिकेशन जानता है कि इससे बात कर रही है।

  1. आप एक अतिरिक्त HTTP हेडर (x-forwarded-for) है कि मूल आईपी पते निर्दिष्ट करता है जोड़ने के लिए लोड संतुलन कॉन्फ़िगर कर सकते हैं:

    इस से निपटने के लिए दो तरीके हैं। आप इस तरह, UserHostAddress के बजाय इस शीर्ष लेख को देखने के लिए अपने वेब साइट को संशोधित करने की आवश्यकता होगी:

    //var clientIP = HttpContext.Current.Request.UserHostAddress; 
    var clientIP = HttpContext.Current.Request.Headers["x-forwarded-for"]; 
    

    नोट: एक्स-अग्रेषित-के लिए शीर्ष लेख वास्तव में कुछ मामलों में return a comma-delimited list of IP addresses कर सकते हैं। तो इस तरह के एक घटना के साथ संगत होना करने के लिए, तो आप इस बजाय लिख सकते हैं:

    var clientIP = HttpContext.Current.Request.Headers["x-forwarded-for"].Split(',')[0]; 
    
  2. आप कुछ एलबीएस कॉन्फ़िगर IP हेडर पैकेट को कॉपी करके ग्राहक आईपी के माध्यम से पारित कर सकते हैं। साइट्रिक्स नेटस्केकर के लिए, अधिक जानकारी के लिए this article देखें।

+0

धन्यवाद, @ जॉन वू। Sys व्यवस्थापक ने नेटस्केकर में हेडर जोड़ा और अब यह एक आकर्षण की तरह काम करता है! – Alex

+1

ग्रेट! यह पुष्टि करने के लिए धन्यवाद कि यह काम करता है। हम आम तौर पर विकल्प # 1 करते हैं। –

+0

यूप, उस विकल्प का उपयोग करके और इसे 'HttpContext.Current.Request.Headers ["x-forwarded-for"] के माध्यम से पढ़ रहा है। – Alex

संबंधित मुद्दे