मुझे ASP.NET CORE में क्लाइंट IP पता कैसे मिलेगा?


204

क्या आप मुझे बता सकते हैं कि MVC का उपयोग करते समय ASP.NET में क्लाइंट IP पता कैसे प्राप्त करें Request.ServerVariables["REMOTE_ADDR"]


उदाहरण:httpContext.GetFeature<IHttpConnectionFeature>().RemoteIpAddress
किरण चल्ला

होल्ड का कारण सवाल के नीचे उपलब्ध है, "इस प्रारूप के लिए या तो बहुत अधिक संभावित उत्तर हैं, या अच्छे उत्तर भी होंगे। कृपया उत्तर सेट को संकीर्ण करने या किसी ऐसे मुद्दे को अलग करने के लिए विवरण जोड़ें, जिसका उत्तर दिया जा सकता है। कुछ पैराग्राफ। "
केविन ब्राउन

12
मुझे नहीं लगता कि उत्तर काफी लंबा है। यह एक साधारण बात है जो हम MVC के पुराने संस्करणों में करते हैं। मैंने सिर्फ पूछा कि इसे नवीनतम बीटा संस्करण में कैसे किया जाए। दूसरे, यदि कई उत्तर हैं, तो कोई भी मुझे उनमें से एक को इंगित क्यों नहीं करता है। वास्तव में, MVC 6 बीटा है और मुझे लगता है कि उन्होंने इसे रखने से पहले प्रश्न को ठीक से पढ़ा भी नहीं था।
eadam

अपने प्रश्न को संपादित करें जो आपने प्रयास किया है और एक स्पष्ट इनपुट / आउटपुट। केवल यह शिकायत न करें कि आपका प्रश्न कम से कम इसे सुधारने की कोशिश किए बिना बंद हो गया ।

10
केवल उसी डोमेन के प्रोग्रामर को प्रश्न बंद करना चाहिए। Asp.net 5.0 में काम करने वाला कोई भी व्यक्ति बस यह जान सकेगा कि मैं एक दूसरे के अंश में क्या पूछ रहा हूं। आप में से केवल एक साधारण प्रश्न पोस्ट करने के लिए मुझे सजा दे रहे हैं।
ईदम

जवाबों:


274

एपीआई अद्यतन किया गया है। निश्चित नहीं है कि यह कब बदला लेकिन दिसंबर के अंत में डेमियन एडवर्ड्स के अनुसार , अब आप ऐसा कर सकते हैं:

var remoteIpAddress = request.HttpContext.Connection.RemoteIpAddress;

9
RemoteIpAddressहमेशा होता है nullजब मैं आईआईएस पर वह वेबसाइट प्रकाशित करें और एक फ़ाइल पर यह लोग इन मेरे लिए,।
A-Sharabiani

3
ऐसा लगता है कि इस मुद्दे को आरसी 2 में तय किया गया था
जॉन

12
मुझे हमेशा 127.0.0.1 मिलता है, यहां तक ​​कि जब मैं दूर से कनेक्ट करता हूं
ठंढा हुआ

32
यह मेरे लिए ":: 1" लौटा रहा है जो कि IPv6 प्रारूप है। अन्य लोग 127.0.0.1 कैसे देख रहे हैं?
डेरेक ग्रीर

4
क्या किसी और को अपने IIS सर्वर का स्थानीय आईपी पता वापस मिल जाता है?
dave317

73

Project.json में एक निर्भरता जोड़ें:

"Microsoft.AspNetCore.HttpOverrides": "1.0.0"

में Startup.cs, Configure()विधि जोड़ने में:

  app.UseForwardedHeaders(new ForwardedHeadersOptions
        {
            ForwardedHeaders = ForwardedHeaders.XForwardedFor |
            ForwardedHeaders.XForwardedProto
        });  

और निश्चित रूप से:

using Microsoft.AspNetCore.HttpOverrides;

फिर, मैं उपयोग करके आईपी प्राप्त कर सकता हूं:

Request.HttpContext.Connection.RemoteIpAddress

मेरे मामले में, जब वीएस में डिबगिंग मुझे हमेशा आईपीवी 6 लोकलहोस्ट मिला, लेकिन जब एक आईआईएस पर तैनात किया गया तो मुझे हमेशा रिमोट आईपी मिला।

कुछ उपयोगी लिंक: मुझे ASP.NET कोर में क्लाइंट आईपी एड्रेस कैसे मिलेगा? और RemoteIpAddress हमेशा शून्य होता है

::1की वजह से हो सकता है है:

IIS पर कनेक्शंस की समाप्ति, जो तब Kestrel, v.next वेब सर्वर की ओर अग्रसर होती है, इसलिए वेब सर्वर से कनेक्शन वास्तव में लोकलहोस्ट से होते हैं। ( https://stackoverflow.com/a/35442401/5326387 )


6
यह सही उत्तर है, जिसे रिवर्स प्रॉक्सिस के
मेल्विन

8
यह इंगित करने की आवश्यकता है कि "app.UseForwardedHeaders ..." को app.UseAuthentication () से पहले जोड़ा जाना चाहिए; लाइन, यदि आप इंडेंटिटी का उपयोग करते हैं
नेटफेड

1
यह पूरी तरह से काम किया है और मैंने परीक्षण किया है स्थानीय रूप से होस्ट किए गए IIS और Azure पर। दोनों जगह काम करता है।
थॉमसकेल २ Thomas ’

72

लोड बैलेंसर की उपस्थिति को संभालने के लिए कुछ कमबैक तर्क जोड़े जा सकते हैं।

इसके अलावा, निरीक्षण के माध्यम से, X-Forwarded-Forहेडर वैसे भी एक लोड बैलेंसर के बिना भी सेट किया जा सकता है (संभवतः अतिरिक्त केस्ट्राेल के कारण)?)

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

_httpContextAccessorडीआई के माध्यम से मान लिया गया था।


2
यह सही जवाब है। आईपी ​​पते को पुनः प्राप्त करने का एक भी तरीका नहीं है, विशेष रूप से जब आपका ऐप एक नगीनक्स, एक लोड बैलेंसर या ऐसा कुछ है। धन्यवाद!
Feu

@ Fau तरह का है, क्योंकि AspNetCore X-फॉरवर्डेड-फॉर जैसे हेडर के साथ RemoteIpAddress संपत्ति को ओवरराइड कर सकता है।
मार्क लोपेज

@ क्रोकुसेक ... आपके समाधान को अनुकूलित करने की कोशिश कर रहा है, लेकिन वीएस मुझे इस कोड को स्थिर करने वाले वर्ग के लिए मजबूर कर रहा है। क्या आपके पास अपने वेब ऐप प्रोजेक्ट में या समाधान में एक क्लास लाइब्रेरी में यह कोड है?
डिनोटॉम

पहले 2 तरीके एक उदाहरण में होना चाहिए जो __httpContextAccessor (या इसे अनुकूलित करें) प्रदान करता है। दूसरे 2 स्ट्रिंग तरीकों को एक अलग स्थिर एक्सटेंशन क्लास से खींचा गया था।
क्रुकसेक

यह एक अच्छा समाधान है विशेष रूप से जब आपका ऐप Kestrel का उपयोग करता है और लिनक्स पर Nginx के साथ होस्ट किया जाता है।
टिमोथी मचारिया

16

आप IHttpConnectionFeatureइस जानकारी को प्राप्त करने के लिए उपयोग कर सकते हैं ।

var remoteIpAddress = httpContext.GetFeature<IHttpConnectionFeature>()?.RemoteIpAddress;

जवाब के लिए धन्यवाद!
इदम

2
यह Kestrel होस्टिंग के लिए काम करता है? मेरे डेमो में, httpContext.GetFeature<IHttpConnectionFeature>()हमेशा रहें null
जेरी बियान

2
@JerryBian इस डॉक्टर के अनुसार: github.com/aspnet/Docs/blob/master/aspnet/fundamentals/… , IHttpConnectionFeature Kestrel (अभी तक) में समर्थित नहीं है।
क्यूबिक

@ जेरेबियन यह अब है
डेविड

अवश्य पदावनत किया गया है - मेरे लिए @feradz संस्करण पर काम चल रहा आर सी -1
फिएट

12
var remoteIpAddress = HttpContext.Features.Get<IHttpConnectionFeature>()?.RemoteIpAddress;

6
अति जटिल। MVC पहले से ही आंतरिक रूप से कॉल करता है और इसे नीचे रखता है HttpContext.Connection.RemoteIpAddress
फ्रेड

@Fred - अपने संस्करण रिटर्न आर सी -1 में मेरे लिए शून्य - आईआईएस और प्रकार का छोटा बाज
फिएट

7

यह मेरे लिए काम करता है (DotNetCore 2.1)

[HttpGet]
public string Get() 
{
    var remoteIpAddress = HttpContext.Connection.RemoteIpAddress;
    return remoteIpAddress.ToString();
}

7

ASP.NET 2.1 में, StartUp.cs में इस सेवा को जोड़ें:

services.AddHttpContextAccessor();
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();

और फिर 3 चरण करें:

  1. अपने MVC नियंत्रक में एक चर को परिभाषित करें

    private IHttpContextAccessor _accessor;
  2. नियंत्रक के निर्माता में DI

    public SomeController(IHttpContextAccessor accessor)
    {
        _accessor = accessor;
    }
  3. IP पता पुनः प्राप्त करें

    _accessor.HttpContext.Connection.RemoteIpAddress.ToString()

ऐसा ही किया जाता है।


2
इससे मुझे :: 1 Asp.Net Core 2.2।, लोकलहोस्ट पर।
स्टियन

::1IPv6 में लोकलहोस्ट है। IPv4 के बराबर127.0.0.1
एंडी

3

मेरे मामले में, मेरे पास DotNet Core 2.2 Web App है जो DigitalOcean पर doxy और nginx के साथ रिवर्स प्रॉक्सी के रूप में चल रहा है। Startup.cs में इस कोड के साथ मैं क्लाइंट IP प्राप्त कर सकता हूं

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 वह आईपी था जिसे मैं उपयोग करने से पहले प्राप्त कर रहा था

Request.HttpContext.Connection.RemoteIpAddress.ToString();

2

सबसे पहले, .net Core 1.0 using Microsoft.AspNetCore.Http.Features;संबंधित विधि में फिर नियंत्रक में जोड़ें :

var ip = HttpContext.Features.Get<IHttpConnectionFeature>()?.RemoteIpAddress?.ToString();

मैंने कई अन्य उत्तर पढ़े जो संकलन करने में विफल रहे क्योंकि यह लोअरकेस httpContext का उपयोग कर रहा था, जिससे VS का उपयोग Microsoft.AspNetCore.Http का उपयोग करने के लिए हो रहा था, इसके बजाय उपयुक्त का उपयोग करके, या HttpContext के साथ (कंपाइलर भी गलत है)।


2

.net कोर में ipaddress और hostname प्राप्त करें

इस कोड को कंट्रोलर में डालें

इन कदमों का अनुसरण करें:

var addlist = Dns.GetHostEntry(Dns.GetHostName());
string GetHostName = addlist.HostName.ToString();
string GetIPV6 = addlist.AddressList[0].ToString();
string GetIPV4 = addlist.AddressList[1].ToString();

2

मैंने पाया कि, आप में से कुछ ने पाया है कि आपके द्वारा प्राप्त आईपी पता ::: 1 या 0.0.0.1 है

यह समस्या है क्योंकि आप अपने स्वयं के मशीन से आईपी प्राप्त करने की कोशिश करते हैं, और सी # का भ्रम जो आईपीवी 6 को वापस करने की कोशिश करता है।

तो, मैं @Johna (से जवाब लागू https://stackoverflow.com/a/41335701/812720 ) और @ दाऊद ( https://stackoverflow.com/a/8597351/812720 ), धन्यवाद उन्हें!

और यहाँ समाधान करने के लिए:

  1. अपने संदर्भ में Microsoft.AspNetCore.HttpOverrides पैकेज जोड़ें (निर्भरता / पैकेज)

  2. इस लाइन को 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
    
    }
  3. IPAddress पाने के लिए, अपने किसी भी कंट्रोलर में इस कोड का उपयोग करें

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

और अब आप रिमोटपाइपड्रेस या परिणाम से आईपीवी 4 पता प्राप्त कर सकते हैं


1

इसे इस्तेमाल करे।

var host = Dns.GetHostEntry(Dns.GetHostName());
        foreach (var ip in host.AddressList)
        {
            if (ip.AddressFamily == AddressFamily.InterNetwork)
            {
                 ipAddress = ip.ToString();
            }
        }

0

लोड बैलेंसर के पीछे .NET core(3.1.4) रनिंग IISअन्य सुझाए गए समाधानों के साथ काम नहीं करता था।

X-Forwarded-Forहेडर को मैन्युअल रूप से पढ़ता है।

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

मैं होस्टिंग बंडल का उपयोग कर एक स्व-निहित पैकेज चला रहा हूं ।


0

Ubuntu पर एक ट्राइफिक रिवर्स प्रॉक्सी के पीछे ASP.NET कोर 2.1 चल रहा है, मुझे KnownProxiesआधिकारिक Microsoft.AspNetCore.HttpOverridesपैकेज स्थापित करने के बाद अपना गेटवे आईपी सेट करना होगा

        var forwardedOptions = new ForwardedHeadersOptions {
            ForwardedHeaders = ForwardedHeaders.XForwardedFor,
        };
        forwardedOptions.KnownProxies.Add(IPAddress.Parse("192.168.3.1"));
        app.UseForwardedHeaders(forwardedOptions);

प्रलेखन के अनुसार , यह आवश्यक है यदि रिवर्स प्रॉक्सी लोकलहोस्ट पर नहीं चल रहा है। docker-compose.ymlTraefik की एक स्थिर IP पता निर्दिष्ट किया गया है:

networks:
  my-docker-network:
    ipv4_address: 192.168.3.2

वैकल्पिक रूप से, यह सुनिश्चित करने के लिए पर्याप्त होना चाहिए कि एक ज्ञात नेटवर्क .NET कोर में अपने प्रवेश द्वार को निर्दिष्ट करने के लिए यहां परिभाषित किया गया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.