Как использовать ключи API для защиты веб-API в ASP.NET Core

автор vadim


Существует несколько способов защитить ваши API в ASP.NET Core 7. Вы можете использовать механизм аутентификации пользователя, такой как токены JWT, ASP.NET Core Identity, токены носителя, OpenID Connect или поставщик удостоверений OAuth 2.0, и это лишь некоторые из них. . Аутентификация по ключу API — это еще один подход, который вы можете использовать для защиты своих API.

Обратите внимание, что аутентификация по ключу API не идентифицирует и не аутентифицирует пользователя. Скорее, аутентификация по ключу API использует ключи API для аутентификации приложений или служб, которые получают доступ к вашим API. Ключ API — это токен или уникальный идентификатор, который передается API через заголовок запроса, файл cookie или строку запроса.

Ключи API можно использовать для контроля того, какие приложения могут получать доступ к вашему API, отслеживания моделей их использования или ограничения методов вашего API, которые они могут использовать. Однако ключей API недостаточно для безопасной авторизации. Для этого вам также необходимо реализовать аутентификацию пользователя.

В этой статье мы рассмотрим, как реализовать аутентификацию по ключу API в ASP.NET Core 7. Чтобы использовать приведенные ниже примеры кода, в вашей системе должна быть установлена ​​Visual Studio 2022. Если у вас еще нет копии, вы можете скачать Visual Studio 2022 здесь.

Создайте проект веб-API ASP.NET Core в Visual Studio 2022.

Прежде всего давайте создадим проект веб-API ASP.NET Core 7 в Visual Studio 2022. Выполните следующие действия:

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

Мы будем использовать этот проект веб-API ASP.NET Core 7 для работы с аутентификацией по ключу API в разделах ниже.

Внедрить аутентификацию по ключу API с помощью промежуточного программного обеспечения.

По сути, вы можете реализовать аутентификацию по ключу API в ASP.NET Core двумя разными способами: с помощью пользовательских атрибутов или с помощью промежуточного программного обеспечения. Мы рассмотрим оба этих подхода, начиная с промежуточного программного обеспечения.

Вы можете использовать компоненты промежуточного программного обеспечения в ASP.NET Core, чтобы настроить способ обработки запросов, а также проверять, маршрутизировать и изменять сообщения по мере их прохождения через конвейер обработки запросов. Здесь мы создадим собственное промежуточное программное обеспечение для аутентификации вызовов наших API.

Создайте новый файл .cs с именем CustomApiKeyMiddleware в проекте веб-API, который мы создали ранее. Ваше пользовательское промежуточное программное обеспечение должно иметь конструктор, который принимает аргумент типа RequestDelegate, как показано в приведенном ниже фрагменте кода.

public class CustomApiKeyMiddleware
{
    private readonly RequestDelegate _next;
    const string API_KEY = "Api_Key";
    public CustomApiKeyMiddleware(RequestDelegate next)
    {
        _next = next;
    }
}

Поскольку вам потребуется доступ к экземпляру типа IConfiguration для чтения строки Api_Key из файла AppSettings.json, вам следует передать ссылку типа IConfiguration в качестве параметра в конструкторе, как показано ниже.

public class CustomApiKeyMiddleware
{
    private readonly IConfiguration Configuration;
    private readonly RequestDelegate _next;
    const string API_KEY = "Api_Key";
    public CustomApiKeyMiddleware(RequestDelegate next, IConfiguration configuration)
    {
        _next = next;
        Configuration = configuration;
    } 
}

Ваше пользовательское промежуточное программное обеспечение должно сравнивать Api_Key, считанный из файла AppSettings.json, с тем, который передается в заголовке запроса при вызове конечной точки. Если они совпадают, приложение предоставляет доступ к конечной точке, в противном случае в ответе возвращается соответствующее сообщение об ошибке.

Полный исходный код класса CustomApiKeyMiddleware приведен ниже для справки:

public class CustomApiKeyMiddleware
{
    private readonly IConfiguration Configuration;
    private readonly RequestDelegate _next;
    const string API_KEY = "Api_Key";
    public CustomApiKeyMiddleware(RequestDelegate next,
    IConfiguration configuration)
    {
        _next = next;
        Configuration = configuration;
    }
    public async Task Invoke(HttpContext httpContext)
    {
        bool success = httpContext.Request.Headers.TryGetValue
        (API_KEY, out var apiKeyFromHttpHeader);
        if (!success)
        {
            httpContext.Response.StatusCode = 401;
            await httpContext.Response.WriteAsync("The Api Key for
            accessing this endpoint is not available");
            return;
        }
        string api_key_From_Configuration = Configuration[API_KEY];
        if (!api_key_From_Configuration.Equals(apiKeyFromHttpHeader))
        {
            httpContext.Response.StatusCode = 401;
            await httpContext.Response.WriteAsync("The authentication
            key is incorrect : Unauthorized access");
            return;
        }
        await _next(httpContext);
    }
}

Чтобы использовать промежуточное программное обеспечение, необходимо добавить его в конвейер обработки запросов, включив следующий код в файл Program.cs.

app.UseMiddleware<CustomApiKeyMiddleware>();

Теперь давайте запустим приложение и перейдем к конечной точке WeatherForecast в Postman. Обратите внимание: если вы не укажете строку Api_Key в файле AppSettings.json, вы увидите соответствующее сообщение, как показано на рисунке 1 ниже.

аутентификация по ключу API 01 ИДГ

Рисунок 1. Аутентификация не удалась, поскольку в заголовке запроса не было передано значение Api_Key.

Когда вы передаете значение Api_Key в заголовке запроса с помощью Postman, конечная точка успешно возвращает данные, как показано на рисунке 2.

аутентификация по ключу API 02 ИДГ

Рисунок 2. Значение Api_Key передано успешно, и данные возвращены.

Внедрить аутентификацию по ключу API с использованием пользовательских атрибутов.

Давайте теперь рассмотрим, как реализовать аутентификацию по ключу API с использованием пользовательских атрибутов. Атрибут аналогичен любому другому классу, расширяющему класс System.Attribute. Создайте новый CS-файл с именем CustomApiKeyAttribute и введите туда следующий код.

public class CustomApiKeyAttribute : Attribute, IAsyncActionFilter
{
    private const string API_KEY = "Api_Key";
    public async Task OnActionExecutionAsync
           (ActionExecutingContext context, ActionExecutionDelegate next)
    {
        bool success = context.HttpContext.Request.Headers.TryGetValue
            (API_KEY, out var apiKeyFromHttpHeader);
        if (!success)
        {
            context.Result = new ContentResult()
            {
                StatusCode = 401,
                Content = "The Api Key for accessing this endpoint is not available"
            };
            return;
        }
        IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
        configurationBuilder.AddJsonFile("AppSettings.json");
        IConfiguration Configuration = configurationBuilder.Build();
        string api_key_From_Configuration = Configuration[API_KEY];
        if (!api_key_From_Configuration.Equals(apiKeyFromHttpHeader))
        {
            context.Result = new ContentResult()
            {
                StatusCode = 401,
                Content = "The Api key is incorrect : Unauthorized access"
            };
            return;
        }
        await next();
    }
}

Теперь вы можете применить атрибут к классу контроллера, как показано в фрагменте кода, приведенном ниже.

[CustomApiKey]
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    //Code omitted for brevity
}

Теперь снова запустите приложение и укажите неправильный Api_Key с помощью Postman. Вы должны увидеть соответствующее сообщение об ошибке, как показано на рисунке 3.

аутентификация по ключу API 03 ИДГ

Рисунок 3. Передача неправильного значения Api_Key через Postman приведет к несанкционированному запросу, и данные не будут возвращены.

Заключение

Обратите внимание, что аутентификация по ключу API используется для проверки вызовов наших API, а не пользователя. Другими словами, ключи API используются для аутентификации приложений, отправляющих запросы к нашим API. Ключи API полезны для идентификации приложений и служб, использующих ваш API, контроля или ограничения их доступа к методам вашего API, а также мониторинга моделей их использования, но их нельзя использовать для идентификации отдельных пользователей.

Аутентификация по ключу API не имеет ничего общего с аутентификацией пользователя, т. е. с проверкой учетных данных пользователя приложения, делающего запрос. Для действительно безопасной авторизации необходимо использовать какой-либо механизм аутентификации пользователя.

Дальше читайте это:

  • Облачные вычисления больше не являются пустяком
  • Что такое генеративный ИИ? Искусственный интеллект, который создает
  • Программирование с помощью ИИ: советы и лучшие практики от разработчиков
  • Python пытается удалить GIL и повысить параллелизм
  • 7 причин, по которым Java по-прежнему хороша
  • Война за лицензирование открытого исходного кода окончена

Related Posts

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