MVC 6을 사용할 때 ASP.NET에서 클라이언트 IP 주소를 얻는 방법을 알려주십시오 Request.ServerVariables["REMOTE_ADDR"]
.
답변
API가 업데이트되었습니다. 언제 바뀌 었는지 확실하지 않지만 12 월 말 에 Damien Edwards 에 따르면 다음 과 같이 할 수 있습니다.
var remoteIpAddress = request.HttpContext.Connection.RemoteIpAddress;
답변
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
필자의 경우 VS에서 디버깅 할 때 항상 IpV6 localhost를 얻었지만 IIS에 배포 할 때 항상 원격 IP를 얻었습니다.
유용한 링크 :
ASP.NET CORE에서 클라이언트 IP 주소는 어떻게 얻습니까? 및 RemoteIpAddress는 항상 null입니다
은 ::1
어쩌면 때문에입니다 :
IIS에서 연결이 종료되면 v.next 웹 서버 인 Kestrel로 전달되므로 웹 서버에 대한 연결은 실제로 localhost에서 이루어집니다. ( https://stackoverflow.com/a/35442401/5326387 )
답변
로드 밸런서의 존재를 처리하기 위해 일부 대체 논리를 추가 할 수 있습니다.
또한 검사를 통해 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를 통해 제공되었다고 가정합니다 .
답변
IHttpConnectionFeature
이 정보를 얻기 위해를 사용할 수 있습니다 .
var remoteIpAddress = httpContext.GetFeature<IHttpConnectionFeature>()?.RemoteIpAddress;
답변
var remoteIpAddress = HttpContext.Features.Get<IHttpConnectionFeature>()?.RemoteIpAddress;
답변
이것은 나를 위해 작동합니다 (DotNetCore 2.1)
[HttpGet]
public string Get()
{
var remoteIpAddress = HttpContext.Connection.RemoteIpAddress;
return remoteIpAddress.ToString();
}
답변
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()
이것이 수행되는 방법입니다.