В обновления .NET 7 Preview 5 вошло много интересных изменений ASP.NET Core. tl;dr:
- Упрощение конфигурации аутентификации и авторизации на уровне приложения и в конкретных эндпоинтах
- Упрощение работы с JWT
- В Minimal APIs можно собирать параметры эндпоинта в тип модели
Облегчение работы с аутентификацией и авторизацией
Настройка аутентификации и авторизации в приложениях ASP.NET Core требует большого количество правок кода — добавления обработки в IServiceCollection, добавление middleware. Конфигурация может иметь много тонких настроек, но для типовых сценариев появились новые упрощенные апи для добавления авторизации в приложениях. Изменения касаются в первую очередь JWT-токенов.
Единая точка настройки аутентификации
В WebApplicationBuilder появилось новое свойство Authentication, котроое служит единой точкой настройки аутентификации, которое предоставляет доступ к AuthenticationBuilder и самостоятельно заботится о добавлении нужных middleware в пайплайн обработки.
Пример приложения с аутентификацией по JWT-токену, где для одного из методов проверяется аутентификация (используется nuget-пакет Microsoft.AspNetCore.Authentication.JwtBearer):
Для задания настроек аутентификации и разделения этих настроек между разными средами используется раздел Authentication в настройках приложениях. Сейчас обновился раздел для настроек JWT-токенов, но к релизу будут добавлены и другие схемы аутентификации. Пример appsettings.Development.json:
Настройка авторизации для отдельных эндпоинтов
В примере выше один из эндпоинтов приложения требовал аутентифицировнного пользователя с помощью метода RequireAuthorization(). Для авторизации обычно используются глобальные настройки Policy с заданием этих политик для эндпоинтов или группы эндпоинтов. Это облегчает переиспользование, но усложняет чтение и управление политиками.
Если требуется задать дополнительную проверку авторизации на конкретный эндпоинт, например, наличия у пользователя определенного claim, то это можно без объявления Policy напрямую:
Утилита для выпуска JWT-токенов в локальном окружении
Если мы попытаемся локально вызвать эндпоинты приложения, защищенные авторизацией, через Postman, curl или dotnet httprepl, то получим ответ сервера 401 Unauthorized:
Нам нужно передать JWT-токен вместе с запросом. На продакшене за выпуск и управление токенами обычно отвечает Security token service (STS). Но для проверки АПИ во время разработки мы можем использовать новую утилиту командной строки dotnet user-jwts для создания и управления токенами.
Новая утилита использует систему пользовательских секретов. В будущих версиях dotnet user-jwts будет автоматически инициализировать подсистему секретов, но в Preview 5 нужно предварительно сделать это самостоятельно с помощью dotnet user-secrets init и dotnet user-secrets list:
После этого мы можем воспользоваться новой утилитой:
Команда create сама обновит файл appsettings.Development.json с помощью необходимых значений конфигурации для схемы аутентификации через JWT для распознавания пользовательских JWT.
После этого можно воспользоваться выпущенным токеном при обращении к методу:
Можно создавать JWT с разными параметрами — кастомными claims, именем и другими настройками:
Биндинг параметров в тип модели для Minimal APIs
Если совсем коротко, то теперь для эндпоинтов с большим числом параметров можно собирать эти параметры в одну модель и получать её на входе обработчика, используя атрибут [AsParameters]:
Правила привязки, которые применялись к параметрам метода, будут применены к свойствам модели или параметрам её конструктора. Можно, как и раньше, явно указывать правила привязки с помощью атрибутов FromRoute, FromQuery, FromServices и других. Например, если мы хотим передавать номер страницы и размер страницы для пагинации через header запроса, то модель будет выглядеть так:
В качестве моделей можно использовать классы, структуры и записи, нельзя использовать абстрактные типы и интерфейсы.