আমি কীভাবে এএসপি.নেট কোরে ক্লায়েন্টের আইপি ঠিকানা পেতে পারি?


202

আপনি কি দয়া করে আমাকে এমভিসি 6 ব্যবহার করার সময় এএসপি.নেটে ক্লায়েন্টের আইপি অ্যাড্রেস পাবেন তা আমাকে জানান Request.ServerVariables["REMOTE_ADDR"]


উদাহরণ:httpContext.GetFeature<IHttpConnectionFeature>().RemoteIpAddress
কিরণ চালা

প্রশ্নের হোল্ড কারণটি এই প্রশ্নের নীচে উপলব্ধ যে "সম্ভবত অনেকগুলি উত্তর আছে বা ভাল উত্তরগুলি এই ফর্ম্যাটের জন্য খুব দীর্ঘ হবে Please অনুগ্রহ করে উত্তর সেটটি সংকীর্ণ করার জন্য বিবরণ যুক্ত করুন বা যে কোনও উত্তরটিতে উত্তর দেওয়া যেতে পারে তা আলাদা করতে কয়েকটি অনুচ্ছেদ। "
কেভিন ব্রাউন

12
আমি মনে করি না উত্তরটি যথেষ্ট দীর্ঘ। এটি একটি সাধারণ জিনিস যা আমরা এমভিসির পুরানো সংস্করণগুলিতে করি। আমি স্রেফ জিজ্ঞাসা করেছি কীভাবে এটি সর্বশেষ বিটা সংস্করণে করবেন। দ্বিতীয়ত, যদি অনেক উত্তর থাকে তবে কেন কেউ আমাকে কেবল তার একটিতে নির্দেশ করবেন না। প্রকৃতপক্ষে, এমভিসি 6 হ'ল বিটা এবং আমার মনে হয় তারা প্রশ্নটি ধরে রাখার আগে তারা সঠিকভাবে পড়েনি।
এডাম

আপনি কী চেষ্টা করেছেন তার আরও একটি পরিষ্কার ইনপুট / আউটপুট প্রদর্শন করে আপনার প্রশ্ন সম্পাদনা করুন। কমপক্ষে এটির উন্নতি করার চেষ্টা না করেই আপনার প্রশ্নটি বন্ধ হয়ে গেছে বলে কেবল অভিযোগ করবেন না ।

10
একই ডোমেন থেকে প্রোগ্রামারদের কেবল প্রশ্নটি বন্ধ করা উচিত। Asp.net 5.0 এ যে কেউ কাজ করছে সে সহজেই জানতে পারবে আমি একটি সেকেন্ডের ভগ্নাংশে কী জিজ্ঞাসা করছি। আপনারা বাকিরা কেবল একটি সাধারণ প্রশ্ন পোস্ট করার জন্য আমাকে শাস্তি দিচ্ছেন।
এডাম

উত্তর:


271

এপিআই আপডেট করা হয়েছে। কখন পরিবর্তন হয়েছিল তা নিশ্চিত নয় তবে ডিসেম্বরের শেষের দিকে ড্যামিয়েন এডওয়ার্ডসের মতে আপনি এখন এটি করতে পারেন:

var remoteIpAddress = request.HttpContext.Connection.RemoteIpAddress;

9
RemoteIpAddressসর্বদা nullযখন আমি আইআইএস তিনি ওয়েবসাইট প্রকাশ এবং একটি ফাইল-এ এই লগ আমার জন্য।
এ-শারাবিয়ানি

3
দেখে মনে হচ্ছে যে সমস্যাটি আরসি 2-এ সংশোধিত হয়েছিল
জন

12
আমি সর্বদা 127.0.0.1 পাই এমনকি আমি দূর থেকে সংযোগ
করিও

32
এটি আমার জন্য ":: 1" ফিরিয়ে দিচ্ছে যা আইপিভি 6 ফর্ম্যাট। অন্যরা কীভাবে 127.0.0.1 দেখছেন?
ডেরেক গ্রেয়ার

4
অন্য কেউ কি তাদের আইআইএস সার্ভারের স্থানীয় আইপি ঠিকানা ফিরে পাবে?
dave317

73

প্রোজেক্ট.জসনে একটি নির্ভরতা যুক্ত করুন:

"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 লোকালহোস্ট পেয়েছিলাম, তবে আইআইএস-এ স্থাপন করা অবস্থায় আমি সর্বদা দূরবর্তী আইপি পেয়েছিলাম।

কিছু দরকারী লিঙ্ক: আমি কীভাবে এএসপি.নেট কোরে ক্লায়েন্টের আইপি ঠিকানা পেতে পারি? এবং রিমোটআইপিএড্রেস সর্বদা শূন্য থাকে

এর ::1কারণ হ'ল:

আইআইএস-এ সংযোগ সমাপ্তি, যা পরে ক্যাসরল, v.next ওয়েব সার্ভারে ফরোয়ার্ড করে, তাই ওয়েব সার্ভারের সাথে সংযোগগুলি অবশ্যই লোকালহোস্টের। ( https://stackoverflow.com/a/35442401/5326387 )


6
এটি সঠিক উত্তর, এটি বিপরীত প্রক্সি সম্পর্কিত সরকারী ডকুমেন্টেশনেও নথিভুক্ত করা হয়েছে: ডকস.মাইক্রোসফটকম
মেলভিন

8
অ্যাপটিকে "অ্যাপ.উস ফরওয়ার্ডহাইডার্স ..." যুক্ত করার দরকার রয়েছে তা চিহ্নিত করতে হবে seউসঅথেন্টিকেশন (); লাইন, আপনি
ইন্ডেন্টিটি

1
এটি নিখুঁতভাবে কাজ করেছে এবং আমি পরীক্ষা করেছি স্থানীয়ভাবে আয়োজিত আইআইএস এবং অ্যাজুরিতে। উভয় জায়গায় কাজ করে।
টমাসস্লে

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 ধরণের, যেহেতু AspNetCore রিমোটআইপিএড্রেস সম্পত্তিটি এক্স-ফরওয়ার্ড-ফর এর মতো শিরোনাম দিয়ে ওভাররাইড করতে পারে।
মার্ক লোপেজ

@ ক্রোকুসেক ... আপনার সমাধানটি মানিয়ে নেওয়ার চেষ্টা করছেন, কিন্তু ভিএস আমাকে এই কোডটি স্থিতিশীল করে ক্লাসে বাধ্য করছে। আপনার ওয়েব অ্যাপ্লিকেশন প্রকল্পে বা সমাধানে কোনও ক্লাস লাইব্রেরিতে এই কোডটি রয়েছে?
ডিনোটম

প্রথম 2 টি পদ্ধতিতে এমন একটি দৃষ্টান্ত হওয়া উচিত যা __httpContextAccessor সরবরাহ করে (বা এটি অভিযোজিত)। দ্বিতীয় 2 স্ট্রিং পদ্ধতিগুলি একটি পৃথক স্ট্যাটিক এক্সটেনশন ক্লাস থেকে টানা হয়েছিল।
ক্রোকসেক

এটি একটি ভাল সমাধান বিশেষত যখন আপনার অ্যাপ্লিকেশন কেষ্টরেল ব্যবহার করে এবং লিনাক্সে এনগিনেক্সের সাথে হোস্ট করা হয়।
টিমোথি মাচারিয়া

16

আপনি IHttpConnectionFeatureএই তথ্য পাওয়ার জন্য ব্যবহার করতে পারেন ।

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

উত্তর করার জন্য ধন্যবাদ!
এডাম

2
এটি কিস্ট্রেল হোস্টিংয়ের জন্য কাজ করে? আমার ডেমোতে, httpContext.GetFeature<IHttpConnectionFeature>()সর্বদা থাকুন null
জেরি বিয়ান

2
@ জেরিবিয়ান এই দস্তাবেজ অনুসারে: github.com/aspnet/Docs/blob/master/aspnet/fundamentals/… , IHttpConnicationFeature কেস্ট্রল (এখনও) তে সমর্থিত নয়।
কিউবিক

@ জেরিবিয়ান এটি এখন
ডেভিড পেডেন

আবশ্যক অবচিত হয়েছে - আমার জন্য @feradz সংস্করণ কাজে রেসিন-1
ক্ষমতাপ্রদান

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

6
অতিরিক্ত জটিল এমভিসি ইতিমধ্যে এটি অভ্যন্তরীণভাবে কল করে এবং এর অধীনে রাখে HttpContext.Connection.RemoteIpAddress
ফ্রেড

@Fred - আপনার সংস্করণ আয় রেসিন-1 আমার জন্য নাল - আইআইএস এবং চিল
ক্ষমতাপ্রদান

7

এএসপি.নেট ২.১ এ, স্টার্টআপসে এই পরিষেবাগুলি যুক্ত করুন:

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

এবং তারপরে 3 পদক্ষেপ করুন:

  1. আপনার এমভিসি কন্ট্রোলারে একটি পরিবর্তনশীল সংজ্ঞায়িত করুন

    private IHttpContextAccessor _accessor;
  2. নিয়ন্ত্রকের কনস্ট্রাক্টরের ডিআই

    public SomeController(IHttpContextAccessor accessor)
    {
        _accessor = accessor;
    }
  3. আইপি ঠিকানা পুনরুদ্ধার করুন

    _accessor.HttpContext.Connection.RemoteIpAddress.ToString()

এটি এভাবেই করা হয়।


2
এটি আমাকে দেয়: 1। লোকালহোস্টে Asp.Net কোর 2.2।,
স্টায়ান

::1IPv6 এ লোকালহোস্ট। এর আইপিভি 4 সমতুল্য127.0.0.1
অ্যান্ডি

6

এটি আমার পক্ষে কাজ করে (ডটনেটকোর ২.১)

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

3

আমার ক্ষেত্রে, আমার কাছে ডটনেট কোর ২.২ ওয়েব অ্যাপ্লিকেশনটি ডিজিটাল ওসনে চলছে বিপরীত প্রক্সি হিসাবে ডকার এবং এনজিনেক্স সহ running স্টার্টআপ.সিএস-এ এই কোডটি দিয়ে আমি ক্লায়েন্টের আইপি পেতে পারি

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

প্রথমে। নেট কোর ১.০ using Microsoft.AspNetCore.Http.Features;কন্ট্রোলারে যুক্ত করুন তারপরে প্রাসঙ্গিক পদ্ধতির অভ্যন্তরে:

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

আমি আরও বেশ কয়েকটি উত্তর পড়েছিলাম যা সংকলন করতে ব্যর্থ হয়েছিল কারণ এটি একটি ছোট হাতের এইচটিসি কনটেক্সট ব্যবহার করছিল যা মাইক্রোসফ্ট.এএসপনেটকোর.এইচটিটিপি ব্যবহার করে উপযুক্ত ব্যবহারের পরিবর্তে, বা এইচটিটিপি কনটেক্সট সহ (সংকলকটিও বিভ্রান্ত)।


2

আইপ্যাড্রেস এবং। নেট কোর হোস্টনাম পান

এই কোডটি নিয়ামকের মধ্যে রাখুন

এই পদক্ষেপগুলি অনুসরণ করুন:

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

2

আমি খুঁজে পেয়েছি যে, আপনারা কেউ কেউ পেয়েছেন যে আপনি পেয়েছেন সেই IP ঠিকানা ::: 1 বা 0.0.0.1

এটি আপনার নিজের মেশিন থেকে আইপি পাওয়ার চেষ্টা করার কারণে এবং আইভিভি 6 ফেরত দেওয়ার চেষ্টা করা সি # এর বিভ্রান্তি কারণ এই সমস্যাটি।

তাই, আমি @Johna (থেকে উত্তর বাস্তবায়ন https://stackoverflow.com/a/41335701/812720 ) এবং @David ( https://stackoverflow.com/a/8597351/812720 ), ধন্যবাদ তাদের!

এবং সমাধানের জন্য এখানে:

  1. আপনার রেফারেন্সগুলিতে মাইক্রোসফ্ট.এস্পনেটকোর.হট্ট্প ওভাররাইড প্যাকেজ যুক্ত করুন (নির্ভরতা / প্যাকেজ)

  2. এই লাইনটি স্টার্টআপ.কে যোগ করুন

    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 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 ঠিকানা পেতে পারেন



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

উবুন্টুতে ট্র্যাফিক রিভার্স প্রক্সির পিছনে এএসপি.নেট কোর ২.১ চালানো KnownProxies, অফিসিয়াল Microsoft.AspNetCore.HttpOverridesপ্যাকেজ ইনস্টল করার পরে আমাকে তার গেটওয়ে আইপি সেট করতে হবে

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

ডকুমেন্টেশন অনুসারে , লোকালহোস্টে বিপরীত প্রক্সি চলমান না থাকলে এটি প্রয়োজনীয় required docker-compose.ymlTraefik একটি স্ট্যাটিক আইপি এড্রেস নির্ধারিত করেছেন:

networks:
  my-docker-network:
    ipv4_address: 192.168.3.2

বিকল্পভাবে, এটি নেট নেটওয়ার্কের গেটওয়ে নির্দিষ্ট করার জন্য একটি পরিচিত নেটওয়ার্কটি এখানে সংজ্ঞায়িত করা হয়েছে তা নিশ্চিত করার পক্ষে যথেষ্ট হওয়া উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.