Как реализовать белые списки IP-адресов в ASP.NET Core 6

автор vadim


При работе с приложениями в 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:

  1. Запустите интегрированную среду разработки Visual Studio 2022.
  2. Нажмите «Создать новый проект».
  3. В окне «Создать новый проект» выберите «ASP.NET Core Web API» из списка отображаемых шаблонов.
  4. Нажмите “Далее.
  5. В окне «Настроить новый проект» укажите имя и местоположение нового проекта.
  6. При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
  7. Нажмите “Далее.
  8. В появившемся следующем окне «Дополнительная информация» убедитесь, что установлен флажок «Использовать контроллеры…». Оставьте для параметра «Тип аутентификации» значение «Нет» (по умолчанию). И убедитесь, что флажки «Включить Docker», «Настроить HTTPS» и «Включить поддержку Open API» сняты, поскольку мы не будем здесь использовать ни одну из этих функций.
  9. Нажмите Создать.

Мы будем использовать этот проект веб-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.

Related Posts

Оставить комментарий