首页 > 编程语言 >asp.net core如何获取客户端IP地址

asp.net core如何获取客户端IP地址

时间:2023-07-04 17:24:20浏览次数:56  
标签:core asp IP 中间件 HttpOverrides proxy IP地址 HttpContext 客户端

客户端直接访问服务器

直接通过HttpContext.Connection.RemoteIpAddress获取客户端Ip

[HttpGet]
[Route("GetClientIP")]
public async Task<IActionResult> GetClientIP()
{
	var ip4 = HttpContext.Connection.RemoteIpAddress.MapToIPv4();
	return Ok(ip4.ToString());
}

客户端通过nginx访问服务器

image

直接通过HttpContext.Connection.RemoteIpAddress获取客户端Ip,就会是nginx的ip,需要通过Headers["X-Forwarded-For"]判断

[HttpGet]
[Route("GetClientIP")]
public async Task<IActionResult> GetClientIP()
{
    var ip4 = this.Request.Headers["X-Forwarded-For"].FirstOrDefault();
	if(string.IsNullOrEmpty(ip4))
	{
		this.Request.Headers["X-Forwarded-Proto"].FirstOrDefault();
	}
	if(string.IsNullOrEmpty(ip4))
	{
		ip4 = HttpContext.Connection.RemoteIpAddress.MapToIPv4();
	}
	return Ok(ip4.ToString());
}

nginx的配置
/etc/nginx/conf.d/xx.conf

server {
    listen        80;
    server_name   example.com *.example.com;
    location / {
        proxy_pass         http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $http_host; #此处官方文档使用的$host缺少端口号
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

Microsoft.AspNetCore.HttpOverrides 中间件

Microsoft.AspNetCore.HttpOverrides 中间件主要用于处理反向代理服务器和负载均衡器等情况下的 HTTP 请求。以下是一些使用场景:

  1. 反向代理服务器:当你的应用程序位于反向代理服务器(如 Nginx、Apache 或 IIS)之后时,反向代理服务器会接收客户端请求,并将请求转发给应用程序。在这种情况下,反向代理服务器可能会修改请求头部,包括客户端 IP 地址和协议信息。通过启用 HttpOverrides 中间件并配置适当的选项,你可以获得客户端的真实 IP 地址和协议信息。

  2. 负载均衡器:如果你的应用程序在负载均衡器的后面运行,负载均衡器可能会传递客户端请求给多个实例。为了获取准确的客户端 IP 地址,你可以使用 HttpOverrides 中间件来识别 X-Forwarded-For 头部字段,并更新 HttpContext.Connection.RemoteIpAddress 属性。

  3. SSL/TLS 终止器:当 SSL/TLS 终止器(如负载均衡器或反向代理服务器)接收到加密的 HTTPS 请求并解密后,它会将请求转发给应用程序时,应用程序可能无法正确获取请求的协议信息。通过配置 HttpOverrides 中间件,你可以更新 HttpContext.Request.Protocol 属性,以便应用程序知道请求是通过 HTTPS 还是 HTTP 发送的。

以下是使用 Microsoft.AspNetCore.HttpOverrides 中间件的示例代码:

首先,确保在启动类的 ConfigureServices 方法中添加以下代码以启用 HttpOverrides 服务:

using Microsoft.AspNetCore.HttpOverrides;

public void ConfigureServices(IServiceCollection services)
{
    // 其他配置项...

    services.Configure<ForwardedHeadersOptions>(options =>
    {
        // 配置要处理的转发头部
        options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
        // 配置受信任的代理服务器 IP 地址或 IP 范围
        options.KnownProxies.Add(IPAddress.Parse("127.0.0.1"));
        // 配置是否要使用逗号分隔的多个 IP 地址作为客户端 IP 地址
        options.ForwardedForHeaderName = "X-Forwarded-For";
        // 配置代理服务器发送的原始协议头部字段
        options.ForwardedProtoHeaderName = "X-Forwarded-Proto";
    });
    // 其他服务配置...
}

接下来,在 Configure 方法中将 HttpOverrides 中间件添加到请求处理管道中:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 其他中间件配置...
    app.UseForwardedHeaders();
    // 其他中间件配置...
}

配置完成后,HttpOverrides 中间件将根据设置处理传入的转发头部,并更新 HttpContext.Connection.RemoteIpAddress 和 HttpContext.Request.Protocol 属性。这样,你就可以通过 HttpContext 获取客户端的真实 IP 地址和使用的协议信息。

查询IP地址定位库(ip2region)

ip2region v2.0 - 是一个离线IP地址定位库和IP定位数据管理框架,10微秒级别的查询效率,提供了众多主流编程语言的 xdb 数据生成和查询客户端实现。

推荐使用IP2Region.Net

  1. 安装 Nuget 包 IP2Region.Net。
Install-Package IP2Region.Net
  1. 使用demo
    image

查询IP返回的数据格式

每个 ip 数据段的 region 信息都固定了格式:国家|区域|省份|城市|ISP,只有中国的数据绝大部分精确到了城市,其他国家部分数据只能定位到国家,后前的选项全部是0。

参考

https://github.com/lionsoul2014/ip2region

标签:core,asp,IP,中间件,HttpOverrides,proxy,IP地址,HttpContext,客户端
From: https://www.cnblogs.com/lgxlsm/p/17523778.html

相关文章

  • Metasploit - Meterpreter研究
    一、meterpreter简介Meterpreter是一个功能强大的远程控制框架,常用于渗透测试和网络攻击中。它是Metasploit框架的一部分,Metasploit是一个流行的开源渗透测试工具集。Meterpreter提供了一个灵活的、模块化的平台,使攻击者能够在受攻击的系统上执行各种操作。Meterpreter具......
  • Vue-CoreVideoPlayer使用
    介绍Vue-CoreVideoPlayer一款基于vue.js的轻量级的视频播放器插件。采用AdobdXD进行UI设计,支持移动端适配,不仅功能强大,颜值也是超一流!Vue-CoreVideoPlayer的说明文档和sample都很完善,上手十分容易。该组件也保持了和原生HTMLVideo属性配置的对接,可定制性很高。播放器......
  • 子网掩码和子网掩码划分IP地址
    1.什么是子网掩码,为什么要有子网掩码IP子网划分实际上就是设计子网掩码的过程。由于在五类的IP地址中,网络号与主机号的的位数并不一致,就造成了要么是网络号太多,要么是主机号太多。为了解决这些问题,就需要划分子网。将一个网络划分为子网:采用借位的方式,从主机位最高位开始借位变为......
  • 哪里需要写哪里,FromServices注入 — ASP.NET CORE
    宗旨:用最少的字,学会最有用的知识!愿景目标:阅读本文您将学会如何运用FromServices的方式进行依赖注入。例子背景:以电脑主机为例子进行讲解,我的电脑主机可以接入外置设备,如:键盘、鼠标。那么键盘又分:PS/2接口类型、USB接口类型、无线类型。鼠标也一样。你在用到ASP.NETCORE依赖注......
  • OnlyOffice文件回调接口net core 版本
    publicclassOfficeFilesController:BaseController//Controller{///<summary>///保存OnlyOffice文件///</summary>[HttpPost]publicvoidSaveOnlyOfficeFile(){varfileDataJson=string.Em......
  • ASP.NET Core 6框架揭秘实例演示[41]:跨域资源的共享(CORS)N种用法
    同源策略是所有浏览器都必须遵循的一项安全原则,它的存在决定了浏览器在默认情况下无法对跨域请求的资源做进一步处理。为了实现跨域资源的共享,W3C制定了CORS规范。ASP.NET利用CorsMiddleware中间件提供了针对CORS规范的实现。(本文提供的示例演示已经同步到《ASP.NETCore6框架揭......
  • ubuntu下新安装的qtcreator无法打开?编译好的qt程序缺少qtcore库文件?
    ubuntu下新安装的qtcreator无法打开?编译好的qt程序缺少qtcore库文件?试试添加qt和qtcreator到环境变量。sudovi/etc/profile新增exportQTDIR=你的qt根目录exportPATH=$QTDIR/bin:$PATHexportLD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATHexportQTCREATOR=你的qtcret......
  • .net core 自定义配置文件
    publicvoidConfigureServices(IServiceCollectionservices){varconfigBuilder=newConfigurationBuilder().SetBasePath(Path.Combine(Directory.GetCurrentDirectory(),"Config")).AddJsonFile(&q......
  • Vue-CoreVideoPlayer 视频播放器组件
    安装cnpminstall-Svue-core-video-player快速使用#在main.js中importVueCoreVideoPlayerfrom'vue-core-video-player'Vue.use(VueCoreVideoPlayer)#默认是英文的'''做国际化'''importVueCoreVideoPlayerfrom'vue-core-video......
  • Fedora CoreOS:一种传统的安装到裸金属的方式
    官方及网上的资料,都是教你通过转换配置文件,并植入到安装过程方式。其实,我们完全可以按照正规、传统的方式来把FedoraCoreOS安装到裸机上。废话不多说,如下操作: step1:下载isolive安装镜像step2:使用下载的isolive安装镜像启动裸金属服务器step3:在isolive系统下(自动......