При работе с приложениями в ASP.NET Core 6 часто требуется создать белый список IP-адресов, чтобы разрешать клиентские запросы только с определенных IP-адресов и блокировать запросы со всех остальных адресов. Мы делаем это, чтобы защитить конечные точки нашего API от потенциально вредоносных запросов со стороны злоумышленников, в то же время разрешая запросы, исходящие с доверенных IP-адресов.
Белый список IP-адресов, также называемый безопасным списком IP-адресов, помогает гарантировать, что конфиденциальные данные нашего приложения будут доступны только тем IP-адресам, которые мы знаем и которым доверяем. Белый список IP-адресов можно реализовать в ASP.NET Core с помощью промежуточного программного обеспечения или фильтров действий MVC. В этой статье показано, как реализовать белый список IP-адресов в ASP.NET Core 6 с помощью промежуточного программного обеспечения.
Для работы с примерами кода, представленными в этой статье, в вашей системе должна быть установлена Visual Studio 2022. Если у вас еще нет копии, вы можете скачать Visual Studio 2022 здесь.
Создайте проект веб-API ASP.NET Core в Visual Studio 2022.
Прежде всего давайте создадим проект ASP.NET Core в Visual Studio 2022. Выполнение этих шагов позволит создать новый проект веб-API ASP.NET Core в Visual Studio 2022:
- Запустите интегрированную среду разработки Visual Studio 2022.
- Нажмите «Создать новый проект».
- В окне «Создать новый проект» выберите «ASP.NET Core Web API» из списка отображаемых шаблонов.
- Нажмите “Далее.
- В окне «Настроить новый проект» укажите имя и местоположение нового проекта.
- При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
- Нажмите “Далее.
- В появившемся следующем окне «Дополнительная информация» убедитесь, что установлен флажок «Использовать контроллеры…». Оставьте для параметра «Тип аутентификации» значение «Нет» (по умолчанию). И убедитесь, что флажки «Включить Docker», «Настроить HTTPS» и «Включить поддержку Open API» сняты, поскольку мы не будем здесь использовать ни одну из этих функций.
- Нажмите Создать.
Мы будем использовать этот проект веб-API ASP.NET Core 6 для работы с белыми списками IP-адресов в последующих разделах этой статьи.
Класс Program в ASP.NET Core 6.
Program и Startup — это основные классы для настройки ваших приложений .NET. Однако ASP.NET Core 6 предоставляет упрощенную модель программирования и размещения, в которой удалена большая часть шаблонного кода. У вас больше нет класса Startup. Вместо этого вам придется написать код для настройки конвейера обработки запросов в классе Program.
Когда вы создаете новый проект ASP.NET Core 6 в Visual Studio, класс Program будет выглядеть следующим образом:
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseAuthorization();
app.MapControllers();
app.Run();
Мы будем использовать этот класс Program в последующих разделах этой статьи. Но сначала мы рассмотрим, как можно реализовать промежуточное программное обеспечение белого списка IP-адресов в ASP.NET Core 6.
Укажите IP-адреса из белого списка в файле конфигурации.
Укажите следующие IP-адреса из белого списка в файле appsettings.json.
"IPWhitelistOptions": {
"Whitelist": [ "192.168.0.9", "192.168.1.9", "::1" ]
}
Обратите внимание, что эти IP-адреса даны только в иллюстративных целях. Вам следует заменить эти IP-адреса на IP-адреса, которые вы хотите внести в белый список.
Теперь создайте новый класс с именем IPWhitelistOptions со следующим кодом, который будет читать значения конфигурации (IP-адреса), которые мы только что указали.
public class IPWhitelistOptions
{
public List<string> Whitelist { get; set; }
}
Создайте класс IPWhitelistMiddleware.
Чтобы создать промежуточное программное обеспечение, которое будет вносить наши IP-адреса в белый список, создайте новый класс под названием IPWhitelistMiddleware со следующим кодом.
public class IPWhitelistMiddleware
{
private readonly RequestDelegate _next;
private readonly IPWhitelistOptions _iPWhitelistOptions;
private readonly ILogger<IPWhitelistMiddleware> _logger;
public IPWhitelistMiddleware(RequestDelegate next,
ILogger<IPWhitelistMiddleware> logger,
IOptions<IPWhitelistOptions> applicationOptionsAccessor)
{
_iPWhitelistOptions = applicationOptionsAccessor.Value;
_next = next;
_logger = logger;
}
public async Task Invoke(HttpContext context)
{
if (context.Request.Method != HttpMethod.Get.Method)
{
var ipAddress = context.Connection.RemoteIpAddress;
List<string> whiteListIPList =
_iPWhitelistOptions.Whitelist;
var isIPWhitelisted = whiteListIPList
.Where(ip => IPAddress.Parse(ip)
.Equals(ipAddress))
.Any();
if (!isIPWhitelisted)
{
_logger.LogWarning(
"Request from Remote IP address: {RemoteIp}
is forbidden.", ipAddress);
context.Response.StatusCode =
(int)HttpStatusCode.Forbidden;
return;
}
}
await _next.Invoke(context);
}
}
Обратите внимание, что в этом примере белый список IP-адресов будет работать для всех команд HTTP, кроме HTTP Get. Если вы хотите, чтобы этот белый список применялся ко всем командам HTTP, вы можете просто закомментировать следующий оператор в методе Invoke.
if (context.Request.Method != HttpMethod.Get.Method)
В методе Invoke нашего промежуточного программного обеспечения мы читаем все IP-адреса из белого списка в списке строк. Если IP-адрес, с которого возник запрос, совпадает с одним из IP-адресов в списке, запрос разрешен; в противном случае промежуточное программное обеспечение возвращает HTTP 403 Forbidden и соответствующее сообщение генерируется в журнале.
Класс IPWhitelistMiddlewareExtensions.
Теперь создайте класс с именем IPWhitelistMiddlewareExtensions и введите следующий код.
public static class IPWhitelistMiddlewareExtensions
{
public static IApplicationBuilder UseIPWhitelist(this
IApplicationBuilder builder)
{
return builder.UseMiddleware<IPWhitelistMiddleware>();
}
}
Мы будем использовать промежуточное программное обеспечение белого списка IP-адресов в классе Program, как показано в следующем разделе.
Настройте промежуточное программное обеспечение белого списка IP-адресов в классе Program.
Вам следует настроить промежуточное программное обеспечение белого списка IP-адресов в классе Program, используя метод Configuration коллекции Service, как показано в приведенном ниже фрагменте кода.
builder.Services.Configure<IPWhitelistOptions>(builder.Configuration.GetSection("IPWhitelistOptions"));
Теперь вставьте следующую строку кода в класс Program, чтобы использовать метод расширения, который мы создали ранее.
app.UseIPWhitelist();
Вот как теперь должен выглядеть ваш класс Program:
using IPWhiteListDemo;
using System.Configuration;
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<IPWhitelistOptions>(builder.Configuration.GetSection("IPWhitelistOptions"));
builder.Services.AddControllers();
var app = builder.Build();
app.UseIPWhitelist();
app.UseAuthorization();
app.MapControllers();
app.Run();
Наконец, запустите приложение, нажав клавишу F5 в Visual Studio. Чтобы протестировать промежуточное программное обеспечение, вы можете отправить запрос HTTP Post от Postman. Если ваш IP-адрес совпадает с любым из IP-адресов в белом списке, запрос будет разрешен. В противном случае запрос будет отклонен, и промежуточное ПО вернет HTTP 403 Forbidden.