Вопрос или проблема
Предыстория
У нас есть веб-приложение, которое будет интегрироваться с внутренним OIDC-провайдером нашей компании с использованием OpenID Connect. Это достаточно просто, мы уже внесли изменения для поддержки этого. В настоящее время в нашем приложении используется “фальшивая аутентификация” для среды, где мы запускаем автоматизированные сквозные тесты. Это созданная нами схема аутентификации на основе куки с множеством защит, чтобы гарантировать, что она не может быть активирована в продакшне (включая директивы компилятора для исключения этого кода в CI-пайплайне).
Дополнительно усложняет задачу усилие по модернизации архитектуры нашего приложения. Команда выбрала веб-API на базе .NET и одностраничное приложение на Angular. В течение длительного времени наше “приложение” будет фактически разделено на два разных приложения на .NET: старое .NET 4 приложение ASP.NET MVC и новое веб-API на .NET 8+ с последней версией Angular. Мы планируем постепенно переносить страницы из старого приложения в новое.
Почему существующие решения не подходят
У нас есть 2 000 автоматизированных сквозных тестов1, которые часто требуют пользователей с очень специфическими правами в нашей системе, поэтому создание фальшивых профилей пользователей в нашем приложении необходимо, чтобы мы могли управлять этими правами.
Внутренний OIDC-провайдер нашей компании поддерживается отдельной командой как корпоративное решение. Он тесно связан с Active Directory. Если вы не человек, работающий на компанию, они не создадут профиль пользователя в провайдере OIDC. Жесткий отказ. Исключений нет. Создание “тестовых” учетных записей не является вариантом по политическим причинам.
Я пытался искать это, но постоянно нахожу библиотеки и пакеты NuGet для интеграции с провайдером OIDC, а не стать провайдером OIDC. Я просматривал список инструментов на C# от OpenID.net, и те, которые в настоящее время поддерживаются, не являются бесплатными, а те, что бесплатные, более не поддерживаются.
Я нашел Oidc.Provider, совместимый с .NET 8, но он не обновлялся с 2021 года, и я не нашел для него общедоступного репозитория исходного кода, что делает меня немного сомневающимся в его использовании.
Цели
- Использовать OIDC-провайдер под нашим контролем для запуска автоматизированных тестов локально на ноутбуке и в нашем CI/CD-пайплайне.
- Избавиться от нашей собранной “фальшивой аутентификации”, потому что она всегда вызывала у меня чувство тревоги.
- Использовать тот же OIDC-провайдер в старом приложении .NET 4 и в новом приложении Angular.
- это значит, что нам не нужно собирать вторую “фальшивую аутентификацию”.
Обязательные требования
Просто чтобы было ясно, мы не используем это в реальной среде; только для автоматизированных тестов во внутренней среде.
- Версия OpenID Connect должна поддерживаться клиентскими библиотеками Microsoft для интеграции OIDC.
- Библиотека или приложение должны быть с открытым исходным кодом, чтобы мы могли сканировать исходный код на наличие уязвимостей.
- Стоимость должна быть бесплатной для бизнес- или правительственных организаций. Мы не являемся проектом с открытым исходным кодом и не являемся некоммерческой организацией.
- JWT будут использоваться обоими нашими приложениями.
- OIDC-провайдер будет размещаться на виртуальных машинах Windows Server, которые мы поддерживаем. Мы можем войти с привилегиями администратора, чтобы настроить все.
- OIDC-провайдер может быть в любой из следующих форм:
- .NET 8+/.NET Standard библиотека, которую мы можем использовать в новом пустом веб-приложении на .NET 8. Мы команда опытных разработчиков .NET, любящих поэкспериментировать с вещами.
- Отдельное веб-приложение, способное размещаться в IIS. Установщик не обязателен.
- Если решения на .NET не существует, мы можем рассмотреть другие технологические стеки, если они работают на веб-сервере IIS на машине Windows Server.
- Хранилище данных:
- Если требуется база данных, у нас есть доступ только к базе данных SQL Server.
- Мы также можем использовать файловое хранилище, если это необходимо.
Дополнительные требования
- Веб-API точки для управления пользователями, хотя мы вполне способны создать их сами, если мы можем подключиться к тому же хранилищу данных.
- Установка и настройка OIDC-провайдера локально на ноутбуке для автоматизированных тестов.
1 Да, я понимаю, что вы удивлены таким количеством сквозных тестов, но по какой-то причине мне удалось уговорить нашу команду написать огромное количество таких тестов, и мне никогда не удалось заставить людей писать больше модульных тестов. Я предпочту иметь целую батарею медленных автоматизированных сквозных тестов в любой день недели, чем полное отсутствие покрытия автоматизированными тестами. Это не идеальный мир.
Ответ или решение
Введение
Когда речь идет о внедрении OpenID Connect для аутентификации в вашей веб-приложении, это требует основательной подготовки, особенно если цель – интеграция с внутренним OIDC-провайдером компании и замена текущей самодельной системы аутентификации. Проблему усугубляет архитектурная модернизация приложения, предполагающая использование .NET веб-API и Angular. Альтернативы легко найти для интеграции с OIDC, но задача сложнее, когда требуется создать собственный провайдер OIDC. Ваша цель – найти бесплатное и поддерживаемое open-source решение, соответствующее требованиям проекта.
Теория
OpenID Connect – это аутентификационный протокол, базирующийся на OAuth 2.0. Он позволяет приложениям проверять идентичность пользователя, на основе аутентификации, выполненной авторизующим сервером, а также получать базовую информацию о профиле пользователя. Протокол широко используется как в корпоративных, так и в открытых проектах, благодаря его безопасности и возможности расширяемости. Основные задачи при внедрении OIDC провайдера – обеспечить согласованность данных, безопасность токенов, простоту взаимодействия с клиентскими приложениями и корректное управление доступом пользователей.
Пример
Существуют различные open-source проекты, которые могут соответствовать вашим требованиям. Однако, важно учитывать, что решение, выбранное для автоматизированного тестирования, должно быть не только бесплатным и поддерживаемым, но также легким в настройке и администрировании на Windows Server в рамках IIS. Вы можете рассмотреть проекты, такие как IdentityServer4 или OpenIddict. Эти решения обеспечивают гибкость и могут быть адаптированы под вашу инфраструктуру с небольшими затратами ресурсов.
IdentityServer4 ранее был одним из самых популярных open-source решений для реализации провайдера OpenID Connect, поддерживающего .NET Core. OpenIddict, как альтернативное решение, также имеет открытый исходный код, поддерживает .NET и предлагает высокую гибкость в настройке. Оба решения способны удовлетворить большинство ваших требований, включая интеграцию с SQL Server для хранения данных о пользователях.
Применение
Учитывая, что вы используете .NET 8+ и вынуждены поддерживать среду выполнения как на старых, так и на новых приложениях, возможно, более целесообразно обратить внимание на OpenIddict. Это решение совместимо с последними версиями .NET и предлагает большую актуальность в поддержке. Оно позволяет самостоятельно настраивать провайдера OIDC, внедряя все необходимые процессы аутентификации и авторизации пользователей на всех уровнях вашего приложения.
Установка и настройка OpenIddict потребуют создания веб-приложения на ASP.NET Core, которое можно развернуть в IIS. Это включает настройки для выпусков JWT токенов и работы с SQL Server для хранения профилей и прав пользователей. Примерная последовательность шагов для внедрения:
1. Создайте новое .NET Core приложение, используя шаблон Web API.
2. Добавьте OpenIddict в проект через NuGet, сконфигурировав его для работы с SQL Server, чтобы сохранять данные о сессиях и пользователях.
3. Настройте конфигурацию для выпуска JWT токенов с необходимыми claims для сопоставления с вашими пользовательскими ролями и правами.
4. Разверните приложение в IIS на вашем Windows Server, обеспечив его доступность для ваших тестовых сред.
Таким образом, OpenIddict выступит надежным провайдером OIDC для ваших автоматических тестов в локальной среде и CI/CD пайплайнах, минимизируя риски и усилия на поддержание отдельных систем аутентификации для разных фрагментов вашего приложения. Это позволяет сосредоточиться на долгосрочной миграции и модернизации, сведя к минимуму сложности переходного периода.
Заключение
Решение вопроса выбором подходящего OIDC провайдера сыграет ключевую роль в успехе модернизации вашего продукта. Адекватная реализация позволит не только упростить текущие тестовые процедуры, но и гармонично интегрироваться в будущие архитектурные изменения, обеспечивая безопасность и управляемость пользовательских данных в полном объеме.