在 ASP.NET CORE Web API 中获取客户端 IP 地址有问题吗?
Posted
技术标签:
【中文标题】在 ASP.NET CORE Web API 中获取客户端 IP 地址有问题吗?【英文标题】:Problem with getting client IP address in ASP.NET CORE Web API? 【发布时间】:2019-10-24 18:35:27 【问题描述】:我通过在 ASP.NET CORE Web API 中使用以下方法获取服务器 IP 地址而不是客户端 IP。
请告诉我哪里出错了。我之前在 asp mvc 中使用过 ServerVariables["HTTP_X_FORWARDED_FOR"]
并且工作正常。
private string DetectIPAddress(HttpRequest request)
var _IP = "RemoteIp:" + request.HttpContext.Connection.RemoteIpAddress.ToString() + " - LocalIpAddress:" +
request.HttpContext.Connection.LocalIpAddress;
try
_IP += " IP.AddressFamily:" + Dns.GetHostEntry(Dns.GetHostName()).AddressList[1].ToString();
_IP += " HostName:" + Dns.GetHostEntry(Dns.GetHostName()).HostName;
catch (Exception e)
return _IP;
【问题讨论】:
请参阅此文档以了解转发的标头:docs.microsoft.com/en-us/aspnet/core/host-and-deploy/… 【参考方案1】:获取客户端 IP 听起来很容易,但实际上我已经尝试获取客户端 IP 好几个小时了,直到我在 @Voodoo 的评论中找到了对我有帮助的 this gist extension method。我想让它更加突出,因此创建一个单独的答案。它与 AWS fargate 上的 .NET 5 一起工作,可能与某种负载均衡器传递一起使用,其中 RemoteIpAddress 单独不起作用。
public static class HttpContextExtensions
//https://gist.github.com/jjxtra/3b240b31a1ed3ad783a7dcdb6df12c36
public static IPAddress GetRemoteIPAddress(this HttpContext context, bool allowForwarded = true)
if (allowForwarded)
string header = (context.Request.Headers["CF-Connecting-IP"].FirstOrDefault() ?? context.Request.Headers["X-Forwarded-For"].FirstOrDefault());
if (IPAddress.TryParse(header, out IPAddress ip))
return ip;
return context.Connection.RemoteIpAddress;
像这样使用它:
var ip = HttpContext.GetRemoteIPAddress().ToString();
【讨论】:
像往常一样 SO - 正确答案是列表中的最后一个..【参考方案2】:在Asp.Net Core Web API
获取Remote Client,IP地址改成之前版本的Asp.Net
Asp.Net Core
引入了一个新的 Http 请求和响应库。
需要添加以下命名空间。
using Microsoft.AspNetCore.Http.Features;
曾经,您添加了namespace
,然后只需添加以下一行代码即可捕获远程客户端IP地址。
HttpContext.Features.Get()?.RemoteIpAddress?.ToString();
注意:当您尝试从本地系统运行应用程序时,上面的代码行会返回结果“::1”,但一旦您将应用程序部署到某个地方,它就会起作用
【讨论】:
它不起作用。它会重新调整我的服务器 IP。记录ipAddress192.168.160.1 请参考gist.github.com/jjxtra/3b240b31a1ed3ad783a7dcdb6df12c36 我还在 statup.cs 中添加了 ForwardedHeadersOptions,它工作正常。非常感谢HttpContext.Connection.RemoteIpAddress
和 HttpContext.Features.Get<IHttpConnectionFeature>()?.RemoteIpAddress
给出相同的结果。这里的正确答案是 ForwardedHeaders。【参考方案3】:
在您的操作方法中使用这一行:
string ipAddress = HttpContext.Connection.RemoteIpAddress?.ToString();
【讨论】:
【参考方案4】:我使用这种方法在.net core 3.1中获取IP
public static string GetIPAddress(HttpContext context)
if (!string.IsNullOrEmpty(context.Request.Headers["X-Forwarded-For"]))
return context.Request.Headers["X-Forwarded-For"];
return context.Connection?.RemoteIpAddress?.ToString();
在 Startup.cs 添加此代码
app.UseForwardedHeaders(new ForwardedHeadersOptions() ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.All );
【讨论】:
以上是关于在 ASP.NET CORE Web API 中获取客户端 IP 地址有问题吗?的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core Web API 在 API GET 请求中检索空白记录
使用 ASP.NET Core MVC 创建 Web API