क्या आप मुझे बता सकते हैं कि MVC का उपयोग करते समय ASP.NET में क्लाइंट IP पता कैसे प्राप्त करें Request.ServerVariables["REMOTE_ADDR"]
।
क्या आप मुझे बता सकते हैं कि MVC का उपयोग करते समय ASP.NET में क्लाइंट IP पता कैसे प्राप्त करें Request.ServerVariables["REMOTE_ADDR"]
।
जवाबों:
एपीआई अद्यतन किया गया है। निश्चित नहीं है कि यह कब बदला लेकिन दिसंबर के अंत में डेमियन एडवर्ड्स के अनुसार , अब आप ऐसा कर सकते हैं:
var remoteIpAddress = request.HttpContext.Connection.RemoteIpAddress;
RemoteIpAddress
हमेशा होता है null
जब मैं आईआईएस पर वह वेबसाइट प्रकाशित करें और एक फ़ाइल पर यह लोग इन मेरे लिए,।
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 )
लोड बैलेंसर की उपस्थिति को संभालने के लिए कुछ कमबैक तर्क जोड़े जा सकते हैं।
इसके अलावा, निरीक्षण के माध्यम से, 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
डीआई के माध्यम से मान लिया गया था।
आप IHttpConnectionFeature
इस जानकारी को प्राप्त करने के लिए उपयोग कर सकते हैं ।
var remoteIpAddress = httpContext.GetFeature<IHttpConnectionFeature>()?.RemoteIpAddress;
httpContext.GetFeature<IHttpConnectionFeature>()
हमेशा रहें null
।
var remoteIpAddress = HttpContext.Features.Get<IHttpConnectionFeature>()?.RemoteIpAddress;
HttpContext.Connection.RemoteIpAddress
।
ASP.NET 2.1 में, StartUp.cs में इस सेवा को जोड़ें:
services.AddHttpContextAccessor();
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();
और फिर 3 चरण करें:
अपने MVC नियंत्रक में एक चर को परिभाषित करें
private IHttpContextAccessor _accessor;
नियंत्रक के निर्माता में DI
public SomeController(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
IP पता पुनः प्राप्त करें
_accessor.HttpContext.Connection.RemoteIpAddress.ToString()
ऐसा ही किया जाता है।
::1
IPv6 में लोकलहोस्ट है। IPv4 के बराबर127.0.0.1
मेरे मामले में, मेरे पास 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();
सबसे पहले, .net Core 1.0 using Microsoft.AspNetCore.Http.Features;
संबंधित विधि में फिर नियंत्रक में जोड़ें :
var ip = HttpContext.Features.Get<IHttpConnectionFeature>()?.RemoteIpAddress?.ToString();
मैंने कई अन्य उत्तर पढ़े जो संकलन करने में विफल रहे क्योंकि यह लोअरकेस httpContext का उपयोग कर रहा था, जिससे VS का उपयोग Microsoft.AspNetCore.Http का उपयोग करने के लिए हो रहा था, इसके बजाय उपयुक्त का उपयोग करके, या HttpContext के साथ (कंपाइलर भी गलत है)।
.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();
मैंने पाया कि, आप में से कुछ ने पाया है कि आपके द्वारा प्राप्त आईपी पता ::: 1 या 0.0.0.1 है
यह समस्या है क्योंकि आप अपने स्वयं के मशीन से आईपी प्राप्त करने की कोशिश करते हैं, और सी # का भ्रम जो आईपीवी 6 को वापस करने की कोशिश करता है।
तो, मैं @Johna (से जवाब लागू https://stackoverflow.com/a/41335701/812720 ) और @ दाऊद ( https://stackoverflow.com/a/8597351/812720 ), धन्यवाद उन्हें!
और यहाँ समाधान करने के लिए:
अपने संदर्भ में Microsoft.AspNetCore.HttpOverrides पैकेज जोड़ें (निर्भरता / पैकेज)
इस लाइन को 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
}
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 पता प्राप्त कर सकते हैं
इसे इस्तेमाल करे।
var host = Dns.GetHostEntry(Dns.GetHostName());
foreach (var ip in host.AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
ipAddress = ip.ToString();
}
}
लोड बैलेंसर के पीछे .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;
}
मैं होस्टिंग बंडल का उपयोग कर एक स्व-निहित पैकेज चला रहा हूं ।
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.yml
Traefik की एक स्थिर IP पता निर्दिष्ट किया गया है:
networks:
my-docker-network:
ipv4_address: 192.168.3.2
वैकल्पिक रूप से, यह सुनिश्चित करने के लिए पर्याप्त होना चाहिए कि एक ज्ञात नेटवर्क .NET कोर में अपने प्रवेश द्वार को निर्दिष्ट करने के लिए यहां परिभाषित किया गया है।
httpContext.GetFeature<IHttpConnectionFeature>().RemoteIpAddress