1. 程式人生 > >ABP vNext 審計日誌獲取真實客戶端IP

ABP vNext 審計日誌獲取真實客戶端IP

![](https://img2020.cnblogs.com/blog/2193154/202101/2193154-20210111101509581-9075912.png) ## 背景 在使用ABP vNext時,當需要記錄審計日誌時,我們按照[https://docs.abp.io/zh-Hans/abp/latest/Audit-Logging](官方文件)配置即可開箱即用,然而在實際生產環境中,某些配置並不可取,比如今天的主角——客戶端IP,記錄使用者操作當下真實的客戶端IP,對於系統安全審計非常重要,ABP也提供了預設的獲取客戶端IP的方法,但是在實際專案中我們需要定製化一些引數,才能滿足我們的需求。 ## ABP vNext預設獲取客戶端IP 原始碼如下(Volo.Abp.AspNetCore.WebClientInfo.HttpContextWebClientInfoProvider.cs) ![](https://img2020.cnblogs.com/blog/2193154/202101/2193154-20210111102212607-1635944798.png) 紅線圈出來的方法,便是預設獲取客戶端IP的行為,看到這裡,應該有所感悟,此種寫法是如:不考慮Nginx配置等的做法,而實際專案部署環境中,我們時常有Nginx對請求進行轉發,應用程式也部署在容器裡面,此時若按此方法獲取IP,定然會出現錯誤,如下截圖獲取的客戶端IP便是錯誤的 ![](https://img2020.cnblogs.com/blog/2193154/202101/2193154-20210111102730061-687358948.png) 如不對其進行重寫,如:::ffff:10.0.1.77、::1等這些並非來自真實的客戶端IP而是執行環境相關機器的IP就會被記錄,因為請求由它們一層層轉發而來 ## 重寫方法 根據自己的環境配置(X-Forwarded-For),將程式碼重寫為如下(重寫程式碼大夥應該都知道,那如何替換現有實現程式碼?參考:https://www.cnblogs.com/yunhuai/p/14261148.html): ``` protected virtual string GetClientIpAddress() { try { var httpContext = HttpContextAccessor.HttpContext; var headers = httpContext?.Request?.Headers; if (headers != null && headers.ContainsKey("X-Forwarded-For")) { httpContext.Connection.RemoteIpAddress = IPAddress.Parse(headers["X-Forwarded-For"].FirstOrDefault().ToString()); } return httpContext?.Connection?.RemoteIpAddress?.ToString(); } catch (Exception ex) { Logger.LogException(ex, LogLevel.Warning); return null; } } ``` ## 效果 ![](https://img2020.cnblogs.com/blog/2193154/202101/2193154-20210111103603004-65312459.png) 如上