2019-7-29-asp-dotnet-core-从-Frp-获取用户真实-IP-地址

title author date CreateTime categories
asp dotnet core 从 Frp 获取用户真实 IP 地址
lindexi
2019-07-29 08:28:23 +0800
2019-05-11 12:32:29 +0800
asp aspdotnetcore dotnetcore

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

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

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

_accessor.HttpContext.Connection.RemoteIpAddress.ToString()

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

            services.AddHttpContextAccessor();
            services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();

然后在构造注入

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 拿到用户的真实地址

        private static bool TryGetUserIpFromFrp(HttpRequest httpContextRequest, out StringValues ip)
        {
            return httpContextRequest.Headers.TryGetValue("X-Forwarded-For", out ip);
        }

下面是使用方法

            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 发布自己的网站

posted @ 2019-11-21 16:05  lindexi  阅读(79)  评论(0编辑  收藏  举报