ASP.NET CORE에서 클라이언트 IP 주소를 어떻게 얻습니까?
MVC 6을 사용할 때 ASP.NET에서 클라이언트 IP 주소를 얻는 방법을 알려주십시오 Request.ServerVariables["REMOTE_ADDR"]
.
API가 업데이트되었습니다. 언제 바뀌 었는지 확실하지 않지만 12 월 말 에 Damien Edwards 에 따르면 다음 과 같이 할 수 있습니다.
var remoteIpAddress = request.HttpContext.Connection.RemoteIpAddress;
로드 밸런서의 존재를 처리하기 위해 일부 대체 논리를 추가 할 수 있습니다.
또한 검사를 통해 X-Forwarded-For
헤더는로드 밸런서가 없어도 설정됩니다 (추가 Kestrel 계층 때문에)?
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
DI를 통해 제공되었다고 가정합니다 .
project.json에서 다음에 대한 종속성을 추가하십시오.
"Microsoft.AspNetCore.HttpOverrides": "1.0.0"
에서 Startup.cs
의의 Configure()
방법 추가 :
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor |
ForwardedHeaders.XForwardedProto
});
그리고 물론 :
using Microsoft.AspNetCore.HttpOverrides;
그런 다음 다음을 사용하여 ip를 얻을 수 있습니다.
Request.HttpContext.Connection.RemoteIpAddress
In my case, when debugging in VS I got always IpV6 localhost, but when deployed on an IIS I got always the remote IP.
Some useful links: How do I get client IP address in ASP.NET CORE? and RemoteIpAddress is always null
The ::1
is maybe because of:
Connections termination at IIS, which then forwards to Kestrel, the v.next web server, so connections to the web server are indeed from localhost. (https://stackoverflow.com/a/35442401/5326387)
You can use the IHttpConnectionFeature
for getting this information.
var remoteIpAddress = httpContext.GetFeature<IHttpConnectionFeature>()?.RemoteIpAddress;
var remoteIpAddress = HttpContext.Features.Get<IHttpConnectionFeature>()?.RemoteIpAddress;
In ASP.NET 2.1, In StartUp.cs Add This Services:
services.AddHttpContextAccessor();
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();
and then do 3 step:
Define a variable in your MVC controller
private IHttpContextAccessor _accessor;
DI into the controller's constructor
public SomeController(IHttpContextAccessor accessor) { _accessor = accessor; }
Retrive the IP Address
_accessor.HttpContext.Connection.RemoteIpAddress.ToString()
This is how it is done.
First, in .Net Core 1.0 Add using Microsoft.AspNetCore.Http.Features;
to the controller Then inside the relevant method:
var ip = HttpContext.Features.Get<IHttpConnectionFeature>()?.RemoteIpAddress?.ToString();
I read several other answers which failed to compile because it was using a lowercase httpContext, leading the VS to add using Microsoft.AspNetCore.Http, instead of the appropriate using, or with HttpContext (compiler is also mislead).
In my case, I have DotNet Core 2.2 Web App running on DigitalOcean with docker and nginx as reverse proxy. With this code in Startup.cs I can get the client 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 was the ip that I was getting before using
Request.HttpContext.Connection.RemoteIpAddress.ToString();
get ipaddress and hostname in .net core
put this code in controller
Follow these Steps:
var addlist = Dns.GetHostEntry(Dns.GetHostName());
string GetHostName = addlist.HostName.ToString();
string GetIPV6 = addlist.AddressList[0].ToString();
string GetIPV4 = addlist.AddressList[1].ToString();
This works for me (DotNetCore 2.1)
[HttpGet]
public string Get()
{
var remoteIpAddress = HttpContext.Connection.RemoteIpAddress;
return remoteIpAddress.ToString();
}
참고URL : https://stackoverflow.com/questions/28664686/how-do-i-get-client-ip-address-in-asp-net-core
'IT' 카테고리의 다른 글
LayoutInflater가 지정한 layout_width 및 layout_height 레이아웃 매개 변수를 무시하는 이유는 무엇입니까? (0) | 2020.05.31 |
---|---|
Objective-C가 NSString을 전환 할 수 있습니까? (0) | 2020.05.31 |
이전 기능이 완료된 후 기능 호출 (0) | 2020.05.31 |
연관 배열 객체의 Javascript foreach 루프 (0) | 2020.05.31 |
JavaScript에는 stringbuilder 클래스가 내장되어 있습니까? (0) | 2020.05.31 |