asp.net core使用jexus部署在linux無法正確 獲取遠程ip的解決辦法


asp.net core程序部署在centos7(下面的解決方案,其他系統都能使用,這里只是我自己部署在centos7),使用服務器jexus進行部署,AppHost模式。

因為請求是由jexus進行了轉發的,所以asp.net zero獲取的ip永遠都是127.0.0.1.。

解決方案:

使用由Jexus作者宇內流雲提供的JwsIntegration替換IISIntegration,它改變默認從請求頭獲取ip的規則,改為由 “X-Original-For”獲取遠程ip(經測試 使用"X-Real-IP"也能獲取)。

JwsIntegration.cs:

    /// <summary>
    /// 用於處理客戶IP地址、端口的HostBuilder中間件
    /// </summary>
    public static class WebHostBuilderJexusExtensions
    {

        /// <summary>
        /// 啟用JexusIntegration中間件
        /// </summary>
        /// <param name="hostBuilder"></param>
        /// <returns></returns>
        public static IWebHostBuilder UseJexusIntegration(this IWebHostBuilder hostBuilder)
        {
            if (hostBuilder == null)
            {
                throw new ArgumentNullException(nameof(hostBuilder));
            }

            // 檢查是否已經加載過了
            if (hostBuilder.GetSetting(nameof(UseJexusIntegration)) != null)
            {
                return hostBuilder;
            }


            // 設置已加載標記,防止重復加載
            hostBuilder.UseSetting(nameof(UseJexusIntegration), true.ToString());


            // 添加configure處理
            hostBuilder.ConfigureServices(services =>
            {
                services.AddSingleton<IStartupFilter>(new JwsSetupFilter());
            });


            return hostBuilder;
        }

    }

    class JwsSetupFilter : IStartupFilter
    {
        public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
        {
            return app =>
            {
                app.UseMiddleware<JexusMiddleware>();
                next(app);
            };
        }
    }


    class JexusMiddleware
    {
	    readonly RequestDelegate _next;
        public JexusMiddleware(RequestDelegate next, ILoggerFactory loggerFactory, IOptions<IISOptions> options)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext httpContext)
        {
            var headers = httpContext.Request.Headers;

            try
            {
                if (headers != null && headers.ContainsKey("X-Original-For"))
                {
                    var ipaddAdndPort = headers["X-Original-For"].ToArray()[0];
                    var dot = ipaddAdndPort.IndexOf(":", StringComparison.Ordinal);
                    var ip = ipaddAdndPort;
                    var port = 0;
                    if (dot > 0)
                    {
                        ip = ipaddAdndPort.Substring(0, dot);
                        port = int.Parse(ipaddAdndPort.Substring(dot + 1));
                    }

                    httpContext.Connection.RemoteIpAddress = System.Net.IPAddress.Parse(ip);
                    if (port != 0) httpContext.Connection.RemotePort = port;
                }
            }
            finally
            {
                await _next(httpContext);
            }

        }

    }

使用方法:

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM