আপনি কি দয়া করে আমাকে এমভিসি 6 ব্যবহার করার সময় এএসপি.নেটে ক্লায়েন্টের আইপি অ্যাড্রেস পাবেন তা আমাকে জানান Request.ServerVariables["REMOTE_ADDR"]
।
আপনি কি দয়া করে আমাকে এমভিসি 6 ব্যবহার করার সময় এএসপি.নেটে ক্লায়েন্টের আইপি অ্যাড্রেস পাবেন তা আমাকে জানান Request.ServerVariables["REMOTE_ADDR"]
।
উত্তর:
এপিআই আপডেট করা হয়েছে। কখন পরিবর্তন হয়েছিল তা নিশ্চিত নয় তবে ডিসেম্বরের শেষের দিকে ড্যামিয়েন এডওয়ার্ডসের মতে আপনি এখন এটি করতে পারেন:
var remoteIpAddress = request.HttpContext.Connection.RemoteIpAddress;
RemoteIpAddress
সর্বদা null
যখন আমি আইআইএস তিনি ওয়েবসাইট প্রকাশ এবং একটি ফাইল-এ এই লগ আমার জন্য।
প্রোজেক্ট.জসনে একটি নির্ভরতা যুক্ত করুন:
"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 )
লোড ব্যালান্সারের উপস্থিতি পরিচালনা করতে কিছু ফ্যালব্যাক যুক্তি যুক্ত করা যেতে পারে।
এছাড়াও, পরিদর্শনের মাধ্যমে, 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
।
এএসপি.নেট ২.১ এ, স্টার্টআপসে এই পরিষেবাগুলি যুক্ত করুন:
services.AddHttpContextAccessor();
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();
এবং তারপরে 3 পদক্ষেপ করুন:
আপনার এমভিসি কন্ট্রোলারে একটি পরিবর্তনশীল সংজ্ঞায়িত করুন
private IHttpContextAccessor _accessor;
নিয়ন্ত্রকের কনস্ট্রাক্টরের ডিআই
public SomeController(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
আইপি ঠিকানা পুনরুদ্ধার করুন
_accessor.HttpContext.Connection.RemoteIpAddress.ToString()
এটি এভাবেই করা হয়।
::1
IPv6 এ লোকালহোস্ট। এর আইপিভি 4 সমতুল্য127.0.0.1
আমার ক্ষেত্রে, আমার কাছে ডটনেট কোর ২.২ ওয়েব অ্যাপ্লিকেশনটি ডিজিটাল ওসনে চলছে বিপরীত প্রক্সি হিসাবে ডকার এবং এনজিনেক্স সহ 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();
প্রথমে। নেট কোর ১.০ using Microsoft.AspNetCore.Http.Features;
কন্ট্রোলারে যুক্ত করুন তারপরে প্রাসঙ্গিক পদ্ধতির অভ্যন্তরে:
var ip = HttpContext.Features.Get<IHttpConnectionFeature>()?.RemoteIpAddress?.ToString();
আমি আরও বেশ কয়েকটি উত্তর পড়েছিলাম যা সংকলন করতে ব্যর্থ হয়েছিল কারণ এটি একটি ছোট হাতের এইচটিসি কনটেক্সট ব্যবহার করছিল যা মাইক্রোসফ্ট.এএসপনেটকোর.এইচটিটিপি ব্যবহার করে উপযুক্ত ব্যবহারের পরিবর্তে, বা এইচটিটিপি কনটেক্সট সহ (সংকলকটিও বিভ্রান্ত)।
আইপ্যাড্রেস এবং। নেট কোর হোস্টনাম পান
এই কোডটি নিয়ামকের মধ্যে রাখুন
এই পদক্ষেপগুলি অনুসরণ করুন:
var addlist = Dns.GetHostEntry(Dns.GetHostName());
string GetHostName = addlist.HostName.ToString();
string GetIPV6 = addlist.AddressList[0].ToString();
string GetIPV4 = addlist.AddressList[1].ToString();
আমি খুঁজে পেয়েছি যে, আপনারা কেউ কেউ পেয়েছেন যে আপনি পেয়েছেন সেই IP ঠিকানা ::: 1 বা 0.0.0.1
এটি আপনার নিজের মেশিন থেকে আইপি পাওয়ার চেষ্টা করার কারণে এবং আইভিভি 6 ফেরত দেওয়ার চেষ্টা করা সি # এর বিভ্রান্তি কারণ এই সমস্যাটি।
তাই, আমি @Johna (থেকে উত্তর বাস্তবায়ন https://stackoverflow.com/a/41335701/812720 ) এবং @David ( https://stackoverflow.com/a/8597351/812720 ), ধন্যবাদ তাদের!
এবং সমাধানের জন্য এখানে:
আপনার রেফারেন্সগুলিতে মাইক্রোসফ্ট.এস্পনেটকোর.হট্ট্প ওভাররাইড প্যাকেজ যুক্ত করুন (নির্ভরতা / প্যাকেজ)
এই লাইনটি স্টার্টআপ.কে যোগ করুন
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 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;
}
আমি হোস্টিং বান্ডেলটি ব্যবহার করে একটি স্ব-অন্তর্ভুক্ত প্যাকেজ পরিচালনা করছি ।
উবুন্টুতে ট্র্যাফিক রিভার্স প্রক্সির পিছনে এএসপি.নেট কোর ২.১ চালানো 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.yml
Traefik একটি স্ট্যাটিক আইপি এড্রেস নির্ধারিত করেছেন:
networks:
my-docker-network:
ipv4_address: 192.168.3.2
বিকল্পভাবে, এটি নেট নেটওয়ার্কের গেটওয়ে নির্দিষ্ট করার জন্য একটি পরিচিত নেটওয়ার্কটি এখানে সংজ্ঞায়িত করা হয়েছে তা নিশ্চিত করার পক্ষে যথেষ্ট হওয়া উচিত।
httpContext.GetFeature<IHttpConnectionFeature>().RemoteIpAddress