Существует несколько способов защитить ваши 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. Выполните следующие действия:
- Запустите интегрированную среду разработки Visual Studio 2022.
- Нажмите «Создать новый проект».
- В окне «Создать новый проект» выберите «ASP.NET Core Web API» из списка отображаемых шаблонов.
- Нажмите “Далее.
- В окне «Настроить новый проект» укажите имя и местоположение нового проекта.
- При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
- Нажмите “Далее.
- В следующем окне «Дополнительная информация» оставьте флажок «Использовать контроллеры (снимите флажок, чтобы использовать минимальные API)», поскольку в этом проекте мы не будем использовать минимальные API. Оставьте для параметра «Тип аутентификации» значение «Нет» (по умолчанию).
- Убедитесь, что флажки «Включить поддержку открытого API», «Настроить HTTPS» и «Включить Docker» остаются снятыми, поскольку мы не будем использовать эти функции здесь.
- Нажмите Создать.
Мы будем использовать этот проект веб-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 ниже.
Рисунок 1. Аутентификация не удалась, поскольку в заголовке запроса не было передано значение Api_Key.
Когда вы передаете значение Api_Key в заголовке запроса с помощью Postman, конечная точка успешно возвращает данные, как показано на рисунке 2.
Рисунок 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.
Рисунок 3. Передача неправильного значения Api_Key через Postman приведет к несанкционированному запросу, и данные не будут возвращены.
Заключение
Обратите внимание, что аутентификация по ключу API используется для проверки вызовов наших API, а не пользователя. Другими словами, ключи API используются для аутентификации приложений, отправляющих запросы к нашим API. Ключи API полезны для идентификации приложений и служб, использующих ваш API, контроля или ограничения их доступа к методам вашего API, а также мониторинга моделей их использования, но их нельзя использовать для идентификации отдельных пользователей.
Аутентификация по ключу API не имеет ничего общего с аутентификацией пользователя, т. е. с проверкой учетных данных пользователя приложения, делающего запрос. Для действительно безопасной авторизации необходимо использовать какой-либо механизм аутентификации пользователя.
Дальше читайте это:
- Облачные вычисления больше не являются пустяком
- Что такое генеративный ИИ? Искусственный интеллект, который создает
- Программирование с помощью ИИ: советы и лучшие практики от разработчиков
- Python пытается удалить GIL и повысить параллелизм
- 7 причин, по которым Java по-прежнему хороша
- Война за лицензирование открытого исходного кода окончена