Asp.Net Core安全防護(hù)-客戶端IP白名單限制
前言
本篇展示了如何在ASP.NET Core應(yīng)用程序中設(shè)置IP白名單驗(yàn)證的2種方式。
你可以使用以下2種方式:
- 用于檢查每個(gè)請(qǐng)求的遠(yuǎn)程 IP 地址的中間件。
 - MVC 操作篩選器,用于檢查針對(duì)特定控制器或操作方法的請(qǐng)求的遠(yuǎn)程 IP 地址。
 
中間件
Startup.Configure方法將自定義 AdminSafeListMiddleware 中間件類型添加到應(yīng)用的請(qǐng)求管道。 使用 .NET Core 配置提供程序檢索到該安全,并將其作為構(gòu)造函數(shù)參數(shù)進(jìn)行傳遞。
- app.UseMiddleware<AdminSafeListMiddleware>("127.0.0.1;192.168.1.5;::1");
 
中間件將字符串分析為數(shù)組,并在數(shù)組中搜索遠(yuǎn)程 IP 地址。 如果找不到遠(yuǎn)程 IP 地址,中間件將返回 HTTP 403 禁止訪問(wèn)。 對(duì)于 HTTP GET 請(qǐng)求,將跳過(guò)此驗(yàn)證過(guò)程。
- public class AdminSafeListMiddleware
 - {
 - private readonly RequestDelegate _next;
 - private readonly ILogger<AdminSafeListMiddleware> _logger;
 - private readonly string _safelist;
 - public AdminSafeListMiddleware(
 - RequestDelegate next,
 - ILogger<AdminSafeListMiddleware> logger,
 - string safelist)
 - {
 - _safelist = safelist;
 - _next = next;
 - _logger = logger;
 - }
 - public async Task Invoke(HttpContext context)
 - {
 - if (context.Request.Method != HttpMethod.Get.Method)
 - {
 - var remoteIp = context.Connection.RemoteIpAddress;
 - _logger.LogDebug("Request from Remote IP address: {RemoteIp}", remoteIp);
 - string[] ip = _safelist.Split(';');
 - var bytes = remoteIp.GetAddressBytes();
 - var badIp = true;
 - foreach (var address in ip)
 - {
 - var testIp = IPAddress.Parse(address);
 - if (testIp.GetAddressBytes().SequenceEqual(bytes))
 - {
 - badIp = false;
 - break;
 - }
 - }
 - if (badIp)
 - {
 - _logger.LogWarning(
 - "Forbidden Request from Remote IP address: {RemoteIp}", remoteIp);
 - context.Response.StatusCode = StatusCodes.Status403Forbidden;
 - return;
 - }
 - }
 - await _next.Invoke(context);
 - }
 - }
 
操作篩選器
如果需要針對(duì)特定 MVC 控制器或操作方法的安全安全訪問(wèn)控制,請(qǐng)使用操作篩選器。 例如:。
- public class ClientIpCheckActionFilter : ActionFilterAttribute
 - {
 - private readonly ILogger _logger;
 - private readonly string _safelist;
 - public ClientIpCheckActionFilter(string safelist, ILogger logger)
 - {
 - _safelist = safelist;
 - _logger = logger;
 - }
 - public override void OnActionExecuting(ActionExecutingContext context)
 - {
 - var remoteIp = context.HttpContext.Connection.RemoteIpAddress;
 - _logger.LogDebug("Remote IpAddress: {RemoteIp}", remoteIp);
 - var ip = _safelist.Split(';');
 - var badIp = true;
 - if (remoteIp.IsIPv4MappedToIPv6)
 - {
 - remoteIp = remoteIp.MapToIPv4();
 - }
 - foreach (var address in ip)
 - {
 - var testIp = IPAddress.Parse(address);
 - if (testIp.Equals(remoteIp))
 - {
 - badIp = false;
 - break;
 - }
 - }
 - if (badIp)
 - {
 - _logger.LogWarning("Forbidden Request from IP: {RemoteIp}", remoteIp);
 - context.Result = new StatusCodeResult(StatusCodes.Status403Forbidden);
 - return;
 - }
 - base.OnActionExecuting(context);
 - }
 - }
 
在中 Startup.ConfigureServices ,將操作篩選器添加到 MVC 篩選器集合。 在下面的示例中, ClientIpCheckActionFilter 添加了一個(gè)操作篩選器。 安全日志和控制臺(tái)記錄器實(shí)例作為構(gòu)造函數(shù)參數(shù)進(jìn)行傳遞。
- services.AddScoped<ClientIpCheckActionFilter>(container =>
 - {
 - var loggerFactory = container.GetRequiredService<ILoggerFactory>();
 - var logger = loggerFactory.CreateLogger<ClientIpCheckActionFilter>();
 - return new ClientIpCheckActionFilter(
 - "127.0.0.1;192.168.1.5;::1", logger);
 - });
 
然后,可以將操作篩選器應(yīng)用到具有 [ServiceFilter] 屬性的控制器或操作方法:
- [ServiceFilter(typeof(ClientIpCheckActionFilter))]
 - [HttpGet]
 - public IEnumerable<string> Get()
 
在示例應(yīng)用中,操作篩選器將應(yīng)用于控制器的 Get 操作方法。 當(dāng)你通過(guò)發(fā)送來(lái)測(cè)試應(yīng)用程序時(shí):
HTTP GET 請(qǐng)求,該 [ServiceFilter] 屬性驗(yàn)證客戶端 IP 地址。 如果允許訪問(wèn) Get 操作方法,則 "操作篩選器" 和 "操作" 方法將生成以下控制臺(tái)輸出的變體:
- dbug: ClientIpSafelistComponents.Filters.ClientIpCheckActionFilter[0]
 - Remote IpAddress: ::1
 - dbug: ClientIpAspNetCore.Controllers.ValuesController[0]
 - successful HTTP GET
 
除 GET 之外的 HTTP 請(qǐng)求謂詞將 AdminSafeListMiddleware 驗(yàn)證客戶端 IP 地址。
總結(jié)
該案例完全可以改造成黑名單攔截。















 
 
 





 
 
 
 