背景
在使用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)
紅線圈出來的方法,便是預設獲取客戶端IP的行為,看到這裡,應該有所感悟,此種寫法是如:不考慮Nginx配置等的做法,而實際專案部署環境中,我們時常有Nginx對請求進行轉發,應用程式也部署在容器裡面,此時若按此方法獲取IP,定然會出現錯誤,如下截圖獲取的客戶端IP便是錯誤的
如不對其進行重寫,如:::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;
}
}
效果
如上已正常