asp dotnet core 从 Frp 获取用户真实 IP 地址

2022-08-04 18:13:12 浏览数 (1)

我在本地开一个服务,然后通过 Frp 让小伙伴可以在外网访问我的 API 连接,但是直接通过 RemoteIp 拿到的是本地的地址。本文告诉小伙伴如何通过 Frp 可以拿到用户的真实 IP 地址

我写过dotnet core 通过 frp 发布自己的网站可以在本地运行自己的服务,然后在外网访问到

但是因为是通过本地的 frp 发给用户,也就是本地是 frp 访问,如使用下面代码获取用户的 IP 地址拿到的是本地的地址

代码语言:javascript复制
_accessor.HttpContext.Connection.RemoteIpAddress.ToString()

上面代码的 _accessor 是注入的,需要在 Startup 的 ConfigureServices 添加下面代码

代码语言:javascript复制
            services.AddHttpContextAccessor();
            services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();

然后在构造注入

代码语言:javascript复制
public SomeController(IHttpContextAccessor accessor)
{
    _accessor = accessor;
}

private IHttpContextAccessor _accessor;

详细请看 Edi wang 大神的博客Get Client IP Address in ASP.NET Core 2.x - Edi.Wang 虽然是英文的,但是你可以微信问他

如果使用 frp 的拿到的字符串都是 127.0.0.1 本地的地址,因为就是本地的 frp 访问连接

在 frp 会在访问的时候在 HTTP 添加 X-Forwarded-For 里面是用户的真实 IP 当然这里也可能是代理的地址,所以修改一下代码,通过下面代码可以从 frp 拿到用户的真实地址

代码语言:javascript复制
        private static bool TryGetUserIpFromFrp(HttpRequest httpContextRequest, out StringValues ip)
        {
            return httpContextRequest.Headers.TryGetValue("X-Forwarded-For", out ip);
        }

下面是使用方法

代码语言:javascript复制
            if (TryGetUserIpFromFrp(HttpContext.Request, out var ip))
            {
                str.Append("用户Ip=");
                str.Append(ip);
                str.Append(" ");
            }

Get Client IP Address in ASP.NET Core 2.x - Edi.Wang

dotnet core 通过 frp 发布自己的网站

用 使用 Frp 为你的 Web 服务添加 https 支持 方式是获取不到用户 IP 地址

0 人点赞