gtxyzz

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

gtxyzz 安全防护 2023-01-24 590浏览 0

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

前言

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

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

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

中间件

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

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

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

publicclassAdminSafeListMiddleware
{
privatereadonlyRequestDelegate_next;
privatereadonlyILogger<AdminSafeListMiddleware>_logger;
privatereadonlystring_safelist;

publicAdminSafeListMiddleware(
RequestDelegatenext,
ILogger<AdminSafeListMiddleware>logger,
stringsafelist)
{
_safelist=safelist;
_next=next;
_logger=logger;
}

publicasyncTaskInvoke(HttpContextcontext)
{
if(context.Request.Method!=HttpMethod.Get.Method)
{
varremoteIp=context.Connection.RemoteIpAddress;
_logger.LogDebug("RequestfromRemoteIPaddress:{RemoteIp}",remoteIp);

string[]ip=_safelist.Split(';');

varbytes=remoteIp.GetAddressBytes();
varbadIp=true;
foreach(varaddressinip)
{
vartestIp=IPAddress.Parse(address);
if(testIp.GetAddressBytes().SequenceEqual(bytes))
{
badIp=false;
break;
}
}

if(badIp)
{
_logger.LogWarning(
"ForbiddenRequestfromRemoteIPaddress:{RemoteIp}",remoteIp);
context.Response.StatusCode=StatusCodes.Status403Forbidden;
return;
}
}

await_next.Invoke(context);
}
}

操作筛选器

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

publicclassClientIpCheckActionFilter:ActionFilterAttribute
{
privatereadonlyILogger_logger;
privatereadonlystring_safelist;

publicClientIpCheckActionFilter(stringsafelist,ILoggerlogger)
{
_safelist=safelist;
_logger=logger;
}

publicoverridevoidOnActionExecuting(ActionExecutingContextcontext)
{
varremoteIp=context.HttpContext.Connection.RemoteIpAddress;
_logger.LogDebug("RemoteIpAddress:{RemoteIp}",remoteIp);
varip=_safelist.Split(';');
varbadIp=true;

if(remoteIp.IsIPv4MappedToIPv6)
{
remoteIp=remoteIp.MapToIPv4();
}

foreach(varaddressinip)
{
vartestIp=IPAddress.Parse(address);

if(testIp.Equals(remoteIp))
{
badIp=false;
break;
}
}

if(badIp)
{
_logger.LogWarning("ForbiddenRequestfromIP:{RemoteIp}",remoteIp);
context.Result=newStatusCodeResult(StatusCodes.Status403Forbidden);
return;
}

base.OnActionExecuting(context);
}
}

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

services.AddScoped<ClientIpCheckActionFilter>(container=>
{
varloggerFactory=container.GetRequiredService<ILoggerFactory>();
varlogger=loggerFactory.CreateLogger<ClientIpCheckActionFilter>();

returnnewClientIpCheckActionFilter(
"127.0.0.1;192.168.1.5;::1",logger);
});

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

[ServiceFilter(typeof(ClientIpCheckActionFilter))]
[HttpGet]
publicIEnumerable<string>Get()

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

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

dbug:ClientIpSafelistComponents.Filters.ClientIpCheckActionFilter[0]
RemoteIpAddress:::1
dbug:ClientIpAspNetCore.Controllers.ValuesController[0]
successfulHTTPGET

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

总结

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

继续浏览有关 后端 的文章
发表评论