c# - কিভাবে ASP.NET এ একটি ব্যবহারকারীর ক্লায়েন্ট আইপি ঠিকানা পেতে?




client ip-address (12)

আমাদের কাছে ASP.NET এ আইপি ঠিকানা পেতে Request.UserHostAddress আছে, তবে এটি সাধারণত ব্যবহারকারীর আইএসপি এর আইপি ঠিকানা, ব্যবহারকারীর মেশিনের IP ঠিকানা ঠিক নয়, যেমন একটি লিঙ্ক ক্লিক করে। আমি কিভাবে আসল আইপি ঠিকানা পেতে পারি?

উদাহরণস্বরূপ, একটি স্ট্যাক ওভারফ্লো ব্যবহারকারী প্রোফাইলে এটি হল: "সর্বশেষ অ্যাকাউন্ট কার্যকলাপ: 4 ঘন্টা আগে 86.123.127.8" , তবে আমার মেশিনের আইপি ঠিকানাটি একটু আলাদা। কিভাবে স্ট্যাক ওভারফ্লো এই ঠিকানা পেতে না?

কিছু ওয়েব সিস্টেমে কিছু উদ্দেশ্যে একটি আইপি ঠিকানা চেক আছে। উদাহরণস্বরূপ, একটি নির্দিষ্ট আইপি ঠিকানার সাথে, প্রতি 24 ঘন্টার জন্য ব্যবহারকারীর ডাউনলোড লিঙ্কগুলিতে মাত্র 5 টি ক্লিক থাকতে পারে? এই আইপি ঠিকানাটি অনন্য, কোনও আইএসপির জন্য নয় যা ক্লায়েন্টদের বা ইন্টারনেট ব্যবহারকারীদের একটি বিস্তৃত পরিসর আছে।

আমি ভাল বুঝলাম?


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

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

সম্পাদনা সার্ভারে আপনি যে ঠিকানাটি দেখেন তা ISP এর ঠিকানা হওয়া উচিত নয়, যেহেতু আপনি বলছেন যে এটি একটি বিস্তৃত পরিসর হবে। ব্রডব্যান্ডে একটি বাড়ির ব্যবহারকারীর ঠিকানা তাদের রাউটারের ঠিকানা হবে, তাই ঘরটির ভিতরে থাকা প্রতিটি ডিভাইসটি একই রকমের বাইরে প্রদর্শিত হবে, তবে রাউটারটি প্রতিটি ডিভাইসে ট্র্যাফিকটি সঠিকভাবে রাউটে যাওয়ার জন্য এটি NAT ব্যবহার করে। অফিস পরিবেশ থেকে ব্যবহারকারীদের অ্যাক্সেসের জন্য ঠিকানাটি সমস্ত ব্যবহারকারীর জন্য একই রকম হতে পারে। আইডি এর জন্য আইপি ঠিকানা ব্যবহার করে এমন সাইটগুলি খুব ভুল হওয়ার ঝুঁকি চালায় - আপনি যে উদাহরণগুলি প্রদান করেন সেগুলি ভাল এবং তারা প্রায়শই ব্যর্থ হয়। উদাহরণস্বরূপ আমার অফিস ইউকে তে, ব্রেকআউট পয়েন্ট (যেখানে আমি "ইন্টারনেটে" উপস্থিত ")" অন্য একটি দেশে যেখানে আমাদের প্রধান আইটি সুবিধা রয়েছে তাই আমার অফিস থেকে আমার আইপি ঠিকানা যুক্তরাজ্যে নেই। এই কারণে আমি শুধুমাত্র ইউকে অ্যাক্সেস করতে পারি না, যেমন বিবিসি iPlayer)। যে কোনও সময়ে আমার কোম্পানির শত শত বা এমনকি হাজার হাজার লোক একই IP ঠিকানা থেকে ওয়েবে অ্যাক্সেসের জন্য উপস্থিত হবে।

যখন আপনি সার্ভার কোড লেখেন তখন আপনি কখনই আইপি ঠিকানাটি দেখছেন তা নিশ্চিত করতে পারেন না। কিছু ব্যবহারকারী এই ভাবে এটি পছন্দ। কিছু লোক ইচ্ছাকৃতভাবে আপনাকে বিভ্রান্ত করার জন্য প্রক্সি বা ভিপিএন ব্যবহার করে।

যখন আপনি আপনার মেশিন ঠিকানা স্ট্যাকঅভারফ্লোতে প্রদর্শিত আইপি ঠিকানার সাথে আলাদা বলে থাকেন, তখন আপনি কীভাবে আপনার মেশিনের ঠিকানা খুঁজে পাচ্ছেন? আপনি ipconfig ব্যবহার করে স্থানীয়ভাবে দেখছেন বা এরকম কিছু আমি উপরে বর্ণিত কারণগুলির জন্য ভিন্ন হতে চাই। বাইরের whatismyipaddress.com/ কি ভাবছে তা যাচাই করতে দ্বিধা করতে চান whatismyipaddress.com/

NAT এ এই উইকিপিডিয়া লিঙ্কটি আপনাকে এই বিষয়ে কিছু পটভূমি সরবরাহ করবে।


আপনি ব্যবহারকারী আইপি ঠিকানা বিবেচনা কি? যদি আপনি নেটওয়ার্ক অ্যাডাপ্টারের আইপি ঠিকানাটি চান তবে আমি ভীত যে ওয়েব অ্যাপ্লিকেশানে এটি করার কোনও উপায় নেই। যদি আপনার ব্যবহারকারী NAT বা অন্যান্য স্টাফের পিছনে থাকে তবে আপনি আইপিও পেতে পারবেন না।

আপডেট : যদিও ব্যবহারকারীরা (দ্রুত গতির মতো) সীমাবদ্ধ করার জন্য আইপি ব্যবহার করে এমন ওয়েব সাইটগুলি আছে তবে তারা NAT পরিবেশগুলিতে সঠিকভাবে কাজ করে না।


আপনি যদি ক্লাউডফ্লারে ব্যবহার করেন তবে আপনি এই এক্সটেনশন পদ্ধতিটি চেষ্টা করতে পারেন:

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

আমি মনে করি আমি আপনার সাথে আমার অভিজ্ঞতা শেয়ার করা উচিত। ওয়েল আমি কিছু পরিস্থিতিতে দেখতে REMOTE_ADDR আপনি খুঁজছেন কি পাবেন না। উদাহরণস্বরূপ, যদি আপনার দৃশ্যটির পিছনে একটি লোড ব্যালান্সার থাকে এবং আপনি যদি ক্লায়েন্টের আইপি পেতে চেষ্টা করেন তবে আপনার সমস্যা হবে। আমি আমার আইপি মাস্কিং সফ্টওয়্যার দিয়ে এটি চেক করেছি প্লাস আমি আমার সহকর্মীদের বিভিন্ন মহাদেশে থাকার সাথে চেক। তাই এখানে আমার সমাধান।

যখন আমি কোন ক্লায়েন্টের আইপি জানতে চাই, তখন আমি প্রতিটি সম্ভাব্য প্রমাণগুলি চয়ন করার চেষ্টা করি যাতে তারা নির্ধারণ করতে পারে যে তারা অনন্য কিনা:

এখানে আমি অন্য sever-var খুঁজে পেয়েছি যা আপনি যদি সমস্ত ক্লায়েন্ট পার্শ্বের সঠিক আইপি পেতে চান তবে আপনাকে সাহায্য করতে পারে। তাই আমি ব্যবহার করছি: HTTP_X_CLUSTER_CLIENT_IP

HTTP_X_CLUSTER_CLIENT_IP সর্বদা আপনাকে ক্লায়েন্টের সঠিক আইপি পায়। কোনও ক্ষেত্রে যদি এটি আপনাকে মান দেয় না, তবে আপনার HTTP_X_FORWARDED_FOR সন্ধান করা উচিত কারণ এটি আপনাকে ক্লায়েন্ট আইপি পেতে অন্যতম সেরা প্রার্থী এবং তারপরে REMOTE_ADDR var যা আপনাকে আইপিটি ফেরত দিতে পারে না তবে এটি সবগুলি আমার কাছে থাকতে পারে তিনটি আমি তাদের নিরীক্ষণ সেরা জিনিস খুঁজে পেতে হয়।

আমি এই কিছু ছেলেরা সাহায্য আশা করি।


এটা ব্যবহার কর

Dns.GetHostEntry(Dns.GetHostName())

প্রায়শই আপনি আপনার ওয়েবসাইট পরিদর্শনকারী ব্যক্তির আইপি ঠিকানা জানতে চান। সার্ভারভ্যারিয়েবলস সংগ্রহের "HTTP_X_FORWARDED_FOR" ব্যবহার করে ASP.NET এর সবচেয়ে ভাল উপায়গুলির মধ্যে এটি করার বিভিন্ন উপায় রয়েছে।

কারণটা এখানে...

কখনও কখনও আপনার দর্শকরা প্রক্সি সার্ভার বা রাউটারের পিছনে থাকে এবং স্ট্যান্ডার্ড Request.UserHostAddress শুধুমাত্র প্রক্সি সার্ভার বা রাউটারের আইপি ঠিকানা ক্যাপচার করে। এই ক্ষেত্রে যখন ব্যবহারকারীর আইপি ঠিকানা সার্ভার পরিবর্তনশীল ("HTTP_X_FORWARDED_FOR") এ সংরক্ষণ করা হয়।

সুতরাং আমরা যা করতে চাই তা প্রথমে "HTTP_X_FORWARDED_FOR" চেক করুন এবং যদি এটি খালি হয় তবে আমরা কেবল ServerVariables("REMOTE_ADDR") ফেরত ServerVariables("REMOTE_ADDR")

এই পদ্ধতি foolproof না হলেও, এটি ভাল ফলাফল হতে পারে। নিচে জবস ক্রাউলি এর ব্লগ পোস্ট থেকে নেওয়া ভিবিনেটের এএসপি.নেট কোডটি হল "গোচা: HTTP_X_FORWARDED_FOR একাধিক আইপি ঠিকানা প্রদান করে"

সি শার্প

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

যদি সি হয় # এই ভাবে দেখুন, খুব সহজ

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

হ্যালো ছেলেরা আপনি যে কোডগুলি পাবেন সেগুলি আপনাকে সার্ভার আইপি ঠিকানাটি ক্লায়েন্ট আইপি ঠিকানাটি ফেরত দেবে না। এই কোডটি সঠিক ক্লায়েন্ট আইপি ঠিকানাটি ফেরত দেয়। এটি চেষ্টা করে দেখুন। আরো তথ্যের জন্য এই চেক করুন

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>

@Tony এবং @mangokun @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;
    }
}

চেষ্টা করুন:

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

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




ip-address