在ASP.NET CORE Web API中获取客户端IP地址的问题?

4
我在使用 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;
}

请查看有关转发标头的文档: https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-2.2 - Tratcher
4个回答

4

获取客户端IP地址听起来很容易,但实际上我尝试了很多个小时才找到这个扩展方法,该方法是通过@Voodoo评论中提供的。我想让它变得更加突出,因此创建了一个单独的答案。它适用于.NET 5在AWS Fargate上,可能需要一些负载均衡器的传递,其中仅使用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来说,正确的答案通常是列表中的最后一个。 - Boppity Bop

1

我使用这种方法在 .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 });

0
在您的操作方法中使用此行代码:
string ipAddress = HttpContext.Connection.RemoteIpAddress?.ToString();

0
Asp.Net Core Web API中,获取远程客户端的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 - bahar.alirezaei
2
请参考此链接:https://gist.github.com/jjxtra/3b240b31a1ed3ad783a7dcdb6df12c36 - Voodoo
1
我还在statup.cs中添加了ForwardedHeadersOptions,现在它可以正常工作了。非常感谢。 - bahar.alirezaei
1
HttpContext.Connection.RemoteIpAddressHttpContext.Features.Get<IHttpConnectionFeature>()?.RemoteIpAddress 返回相同的结果。正确的答案是 ForwardedHeaders。 - Tratcher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接