来自微软的说明:Configure ASP.NET Core to work with proxy servers and load balancers | Microsoft Learn

通过该中间件,会更新:

该中间件不仅处理 Forwarded 请求头,还提供了额外的安全措施。

KnownNetworks 和 KnownProxies 表示有效的中间件地址,如果配置了 KnownNetworks 或者 KnownProxies,则该中间件仅仅处理列出在 KnownNetworks 和 KnownProxies 中的地址,而会忽略掉其它的地址。

ForwardLimit 则限制了处理的地址数量,这意味着不是所有列出在请求头中的地址都一定被处理。

默认配置

  • 在应用和客户端之间仅一个代理存在
  • 只有 loopback 地址作为已知代理地址和已知的网络范围
  • forwarded 请求头的名称为 X-Forwarded-For 和 X-Forwarded-Proto
  • 默认的 Forwardedheaders 的值为 ForwardedHeaders.None,意味着不处理,必须通过配置它来启用中间件。

See: Configure ASP.NET Core to work with proxy servers and load balancers | Microsoft Learn

配置示例

下面的示例中,最多检查 2 个元素,支持的代理服务器是 127.0.0.1 和 127.0.10.1,Forwarded For 的请求头名称使用的是自定义的 X-Forwarded-For-My-Custom-Header-Name。

builder.Services.Configure<ForwardedHeadersOptions>(options => {
options.ForwardLimit = 2;
options.KnownProxies.Add(IPAddress.Parse("127.0.10.1"));
options.ForwardedForHeaderName = "X-Forwarded-For-My-Custom-Header-Name";
});

常用配置说明

KnownNetworks

用来表示有效的网段集合。

它是一个集合类型,其中的元素类型为 IPNetwork.

public System.Collections.Generic.IList
<Microsoft.AspNetCore.HttpOverrides.IPNetwork> KnownNetworks { get; }yb

这个 IPNetwork 表示一个网段。

这是它的构造函数,可以看到它通过一个前缀的长度来指定网段。

public IPNetwork(IPAddress prefix, int prefixLength)
:this(prefix, prefixLength, true)
{
}

例如,默认的配置代码如下:

public IList<IPNetwork> KnownNetworks { get; }
= new List<IPNetwork>() {
new IPNetwork(IPAddress.Loopback, 8)
};

表示只要是 127.x.x.x 的网段,8 指的是 8 位,即第一个字节。也就是 127 所在的部分。

KnownProxies

表示有效的代理集合,其中的元素类型为 IpAddress,即单个的网络地址。

例如,默认的配置代码如下:

public IList<IPAddress> KnownProxies { get; }
= new List<IPAddress>() {
IPAddress.IPv6Loopback
};

ForwardLimit

限制中间件处理的在 X-Forwarded- 中的地址数量,默认为 1 个。

默认的配置如下:

public int? ForwardLimit { get; set; } = 1;

通过设置为 null 可以禁用该限制,但是这必须在配置了 KnownProxies 和 KnownNetworks 之后。配置为非 null 的值是一种安全预防措施 (但不是保证),用来防止配置错误的代理,和来自网络上游的恶意请求。

处理的顺序是从右向左的相反顺序进行的,如果使用默认值 1,则仅仅处理请求头中最右边的值。

配置 Forwarded Headers Middleware的更多相关文章

  1. 翻译 - ASP.NET Core 基本知识 - 中间件(Middleware)

    翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-5.0 中间件是集成 ...

  2. ASP.NET Core 中使用负载均衡时获取客户端 IP

    在使用负载均衡的情况下,通过 context.Connection.RemoteIpAddress 获取到的是负载均衡的 IP 地址,需要通过 X-Forwarded-For 请求头才能获取到客户端的 ...

  3. 翻译 - ASP.NET Core 托管和部署 - 在 Linux 上使用 Nginx 托管 ASP.NET Core 网站

    翻译自 https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-5.0 本文介 ...

  4. 翻译 - ASP.NET Core 基本知识 - 通用主机 (Generic Host)

    翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-5.0 ...

  5. 温故知新,.Net Core利用UserAgent+rDNS双解析方案,正确识别并反爬虫/反垃圾邮件

    背景 一般有价值的并保有数据的网站或接口很容易被爬虫,爬虫会占用大量的流量资源,接下来我们参考历史经验,探索如何在.Net Core中利用UserAgent+rDNS双解析方案来正确识别并且反爬虫. ...

  6. Kestrel web server implementation in ASP.NET Core

    https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?tabs=aspnetcore1x&view ...

  7. asp.net core 系列之Reponse caching 之 Response Caching Middleware(4)

    这篇文章介绍 Response Caching Middleware . Response Caching Middleware in ASP.NET Core 通过在ASP.NET Core应用中 ...

  8. [ASP.NET Core] Middleware

    前言 本篇文章介绍ASP.NET Core里,用来处理HTTP封包的Middleware,为自己留个纪录也希望能帮助到有需要的开发人员. ASP.NET Core官网 结构 在ASP.NET Core ...

  9. Django Middleware简介

    1      前言 Django使用非常熟练了,各种API接口不在话下,全都搞定.为方便定位问题在每个API接口的的开始和返回的地方都加上了log打印,记录入参和返回值. 但是这样有一个问题,需要每个 ...

  10. SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用、Ribbon 负载均衡、自定义 Ribbon 配置、禁用 Eureka 实现 Ribbon 调用)

    1.概念:Ribbon 负载均衡 2.具体内容 现在所有的服务已经通过了 Eureka 进行了注册,那么使用 Eureka 注册的目的是希望所有的服务都统一归属到 Eureka 之中进 行处理,但是现 ...

随机推荐

  1. 10款好用的开源 HarmonyOS 工具库

    大家好,我是 V 哥,今天给大家分享10款好用的 HarmonyOS的工具库,在开发鸿蒙应用时可以用下,好用的工具可以简化代码,让你写出优雅的应用来.废话不多说,马上开整. 1. efTool efT ...

  2. go语言中变量的作用域

    Go 语言中的变量作用域规则决定了变量在程序的哪些部分是可见的和可以访问的.理解这些规则对于编写清晰.维护性高的代码非常重要.下面是一个系统性的解释. 变量的作用域类型 包级作用域: 包级作用域的变量 ...

  3. 架构与思维:漫谈高并发业务的CAS及ABA

    1 高并发场景下的难题 1.1 典型支付场景 这是最经典的场景.支付过程,要先查询买家的账户余额,然后计算商品价格,最后对买家进行进行扣款,像这类的分布式操作, 如果是并发量低的情况下完全没有问题的, ...

  4. 2022年1月国产数据库排行榜:TiDB霸榜两年势头不减,openGauss与OceanBase分数大涨

    奎钩粲粲光华动,群玉森森气象新.国产数据库行业在经历了2021年的躬行实践之后,产品.服务.生态等取得了蓬勃发展.从2022年1月份的国产数据库流行度排行榜上,我们可以看到,相较于去年12月份,榜单上 ...

  5. Vnode 的渲染过程

    在tamplate编译的时候,generater 会生成一个render 函数,通过 render 函数会把 template 内容描述成 vnode ,然后vnode 通过一系列操作转换为真实的 D ...

  6. Android复习(一)基础知识

    1. 现在可以使用 Kotlin.Java 和 C++ 语言编写 Android 应用 2.Android四大组件依然坚挺,这是基础并且没有改变的迹象 Activity 服务 广播接收器 内容提供程序 ...

  7. 云原生周刊:Terraform 1.8 发布 | 2024.5.6

    开源项目推荐 xlskubectl 用于控制 Kubernetes 集群的电子表格.xlskubectl 将 Google Spreadsheet 与 Kubernetes 集成.你可以通过用于跟踪费 ...

  8. javascript 中==和===的区别【转载】

     javascript 中==和===的区别[转]     对于JavaScript中比较运算符,可能大家用的比较多的是"==".对于"==="很多人可能很陌生 ...

  9. SpringMvc请求注解@RequestBody请求体/@PathVaribale/@RequestParam【支持Ajax】

    一.@RequestBody请求体 注意请求体只有form表单才有,而对于链接来说不使用 1).在Controller中写 @RequestBody String body是基本用法 另外可以封装对象 ...

  10. .NET周刊【10月第3期 2024-10-20】

    国内文章 我被 .NET8 JIT 的一个BUG反复折磨了半年之久(JIT tier1 finally optimizations) https://www.cnblogs.com/calvinK/p ...