博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ABP vNext 审计日志获取真实客户端IP
阅读量:4034 次
发布时间:2019-05-24

本文共 1200 字,大约阅读时间需要 4 分钟。

背景

在使用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),将代码重写为如下(重写代码大伙应该都知道,那如何替换现有实现代码?参考另一篇:IOC替换原有Service实现):

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;      }}

效果

如上已正常

转载地址:http://sbudi.baihongyu.com/

你可能感兴趣的文章
慢慢欣赏linux 内核模块引用
查看>>
kprobe学习
查看>>
慢慢欣赏linux phy驱动初始化2
查看>>
慢慢欣赏linux CPU占用率学习
查看>>
2020年终总结
查看>>
linux内核学习(4)建立正式内核的页式内存映射, 以x86 32位模式为例
查看>>
Homebrew指令集
查看>>
React Native(一):搭建开发环境、出Hello World
查看>>
React Native(二):属性、状态
查看>>
JSX使用总结
查看>>
React Native(五):Image的各种姿势
查看>>
React Native(四):布局(使用Flexbox)
查看>>
React Native(七):Android双击Back键退出应用
查看>>
Android自定义apk名称、版本号自增
查看>>
adb command not found
查看>>
Xcode 启动页面禁用和显示
查看>>
Decode Ways
查看>>
Plus One
查看>>
Subsets
查看>>
Subsets II
查看>>