在 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.RemoteIpAddressHttpContext.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

ASP.NET Core Web API 在 API GET 请求中检索空白记录

Asp.Net Core 1.1 消费web api

使用 ASP.NET Core MVC 创建 Web API

在c#asp.net core web api中创建jwt令牌[重复]

ASP.NET Core Web API 身份验证