Asp.Net Core安全防护-客户端IP白名单限制

[[420037]]

前言

本篇展示了如何在ASP.NET Core应用程序中设置IP白名单验证的2种方式。

你可以使用以下2种方式:

  • 用于检查每个请求的远程 IP 地址的中间件。
  • MVC 操作筛选器,用于检查针对特定控制器或操作方法的请求的远程 IP 地址。

中间件

Startup.Configure方法将自定义 AdminSafeListMiddleware 中间件类型添加到应用的请求管道。 使用 .NET Core 配置提供程序检索到该安全,并将其作为构造函数参数进行传递。

  1. app.UseMiddleware<AdminSafeListMiddleware>("127.0.0.1;192.168.1.5;::1"); 

中间件将字符串分析为数组,并在数组中搜索远程 IP 地址。 如果找不到远程 IP 地址,中间件将返回 HTTP 403 禁止访问。 对于 HTTP GET 请求,将跳过此验证过程。

  1. public class AdminSafeListMiddleware 
  2.     private readonly RequestDelegate _next; 
  3.     private readonly ILogger<AdminSafeListMiddleware> _logger; 
  4.     private readonly string _safelist; 
  5.  
  6.     public AdminSafeListMiddleware( 
  7.         RequestDelegate next
  8.         ILogger<AdminSafeListMiddleware> logger, 
  9.         string safelist) 
  10.     { 
  11.         _safelist = safelist; 
  12.         _next = next
  13.         _logger = logger; 
  14.     } 
  15.  
  16.     public async Task Invoke(HttpContext context) 
  17.     { 
  18.         if (context.Request.Method != HttpMethod.Get.Method) 
  19.         { 
  20.             var remoteIp = context.Connection.RemoteIpAddress; 
  21.             _logger.LogDebug("Request from Remote IP address: {RemoteIp}", remoteIp); 
  22.  
  23.             string[] ip = _safelist.Split(';'); 
  24.  
  25.             var bytes = remoteIp.GetAddressBytes(); 
  26.             var badIp = true
  27.             foreach (var address in ip) 
  28.             { 
  29.                 var testIp = IPAddress.Parse(address); 
  30.                 if (testIp.GetAddressBytes().SequenceEqual(bytes)) 
  31.                 { 
  32.                     badIp = false
  33.                     break; 
  34.                 } 
  35.             } 
  36.  
  37.             if (badIp) 
  38.             { 
  39.                 _logger.LogWarning( 
  40.                     "Forbidden Request from Remote IP address: {RemoteIp}", remoteIp); 
  41.                 context.Response.StatusCode = StatusCodes.Status403Forbidden; 
  42.                 return
  43.             } 
  44.         } 
  45.  
  46.         await _next.Invoke(context); 
  47.     } 

操作筛选器

如果需要针对特定 MVC 控制器或操作方法的安全安全访问控制,请使用操作筛选器。 例如:。

  1. public class ClientIpCheckActionFilter : ActionFilterAttribute 
  2.     private readonly ILogger _logger; 
  3.     private readonly string _safelist; 
  4.  
  5.     public ClientIpCheckActionFilter(string safelist, ILogger logger) 
  6.     { 
  7.         _safelist = safelist; 
  8.         _logger = logger; 
  9.     } 
  10.  
  11.     public override void OnActionExecuting(ActionExecutingContext context) 
  12.     { 
  13.         var remoteIp = context.HttpContext.Connection.RemoteIpAddress; 
  14.         _logger.LogDebug("Remote IpAddress: {RemoteIp}", remoteIp); 
  15.         var ip = _safelist.Split(';'); 
  16.         var badIp = true
  17.  
  18.         if (remoteIp.IsIPv4MappedToIPv6) 
  19.         { 
  20.             remoteIp = remoteIp.MapToIPv4(); 
  21.         } 
  22.  
  23.         foreach (var address in ip) 
  24.         { 
  25.             var testIp = IPAddress.Parse(address); 
  26.  
  27.             if (testIp.Equals(remoteIp)) 
  28.             { 
  29.                 badIp = false
  30.                 break; 
  31.             } 
  32.         } 
  33.  
  34.         if (badIp) 
  35.         { 
  36.             _logger.LogWarning("Forbidden Request from IP: {RemoteIp}", remoteIp); 
  37.             context.Result = new StatusCodeResult(StatusCodes.Status403Forbidden); 
  38.             return
  39.         } 
  40.  
  41.         base.OnActionExecuting(context); 
  42.     } 

在中 Startup.ConfigureServices ,将操作筛选器添加到 MVC 筛选器集合。 在下面的示例中, ClientIpCheckActionFilter 添加了一个操作筛选器。 安全日志和控制台记录器实例作为构造函数参数进行传递。

  1. services.AddScoped<ClientIpCheckActionFilter>(container => 
  2.     var loggerFactory = container.GetRequiredService<ILoggerFactory>(); 
  3.     var logger = loggerFactory.CreateLogger<ClientIpCheckActionFilter>(); 
  4.  
  5.     return new ClientIpCheckActionFilter( 
  6.         "127.0.0.1;192.168.1.5;::1", logger); 
  7. }); 

然后,可以将操作筛选器应用到具有 [ServiceFilter] 属性的控制器或操作方法:

  1. [ServiceFilter(typeof(ClientIpCheckActionFilter))] 
  2. [HttpGet] 
  3. public IEnumerable<string> Get() 

在示例应用中,操作筛选器将应用于控制器的 Get 操作方法。 当你通过发送来测试应用程序时:

HTTP GET 请求,该 [ServiceFilter] 属性验证客户端 IP 地址。 如果允许访问 Get 操作方法,则 “操作筛选器” 和 “操作” 方法将生成以下控制台输出的变体:

  1. dbug: ClientIpSafelistComponents.Filters.ClientIpCheckActionFilter[0] 
  2.       Remote IpAddress: ::1 
  3. dbug: ClientIpAspNetCore.Controllers.ValuesController[0] 
  4.       successful HTTP GET 

除 GET 之外的 HTTP 请求谓词将 AdminSafeListMiddleware 验证客户端 IP 地址。

总结

 

该案例完全可以改造成黑名单拦截。

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/142333.html<

(0)
管理的头像管理
上一篇2025-03-09 04:44
下一篇 2025-03-09 04:45

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注