Как создать строку подключения с использованием регистрации приложения/субъекта-службы для ASP.NET Core Web API с Entity Framework Core и SQL Server с использованием Microsoft Entra MFA
У меня есть ASP.NET Core Web API, который использует Entity Framework Core для подключения к экземпляру SQL Server с аутентификацией через Microsoft Entra MFA.
В настоящее время я могу подключаться локально, используя следующую строку подключения:
Server=tcp:some-server.database.windows.net,1433;Authentication=Active Directory Interactive;Database=some-database;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;
Однако этот подход открывает браузер с запросом ввода пароля каждый раз, что не будет работать в развернутой среде, такой как App Service или контейнер.
Мне необходимо реализовать решение с использованием субъекта-службы и секретного токена. Я уже сгенерировал следующие учетные данные:
- Имя субъекта-службы
- Секрет
- Идентификатор приложения (клиента)
- Идентификатор клиента
- Идентификатор подписки
- Идентификатор объекта
- Идентификатор каталога
Какой правильный формат строки подключения для этой ситуации, и какие дополнительные шаги требуются для правильного развертывания приложения?
Создание строки подключения с использованием регистрации приложения/субъекта-службы для вашего ASP.NET Core Web API с EF Core и SQL Server с использованием Microsoft Entra MFA
Для создания строки подключения с использованием регистрации приложения/субъекта-службы для вашего ASP.NET Core Web API с EF Core и SQL Server с использованием Microsoft Entra MFA, необходимо использовать режим аутентификации Active Directory Service Principal с вашим идентификатором клиента и секретом. Правильный формат строки подключения: Server=tcp:your-server.database.windows.net,1433;Initial Catalog=your-database;Authentication=Active Directory Service Principal;User Id=your-client-id;Password=your-client-secret;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;, вместе с настройкой параметров вашего приложения и обеспечением безопасности учетных данных в производственных средах.
Содержание
- Понимание методов аутентификации Microsoft Entra
- Создание правильной строки подключения
- Настройка ASP.NET Core Web API
- Лучшие практики безопасности
- Рекомендации по развертыванию
- Устранение распространенных проблем
Понимание методов аутентификации Microsoft Entra
Microsoft Entra (ранее Azure Active Directory) поддерживает несколько режимов аутентификации для подключений к SQL Server, каждый из которых подходит для разных сценариев:
- Active Directory Interactive - Открывает браузер для запроса аутентификации пользователя (то, что вы используете локально)
- Active Directory Service Principal - Использует идентификатор клиента и секрет субъекта-службы для программной аутентификации
- Active Directory Managed Identity - Использует управляемую идентичность приложения (идеально для приложений, размещенных в Azure)
- Active Directory Integrated - Использует проверку подлинности Windows
- Active Directory Password - Использует имя пользователя и пароль
Для вашего сценария развертывания приложения Active Directory Service Principal является подходящим выбором, так как он не требует взаимодействия с пользователем и может быть автоматизирован с использованием учетных данных субъекта-службы.
Согласно документации Microsoft, режим аутентификации Active Directory Service Principal специально разработан для приложений, которым необходимо аутентифицироваться как субъект-служба, что делает его идеальным для развертывания вашего ASP.NET Core Web API.
Создание правильной строки подключения
На основе ваших учетных данных и результатов исследования, вот правильный формат строки подключения для вашего субъекта-службы:
Server=tcp:your-server.database.windows.net,1433;
Initial Catalog=your-database;
Authentication=Active Directory Service Principal;
User Id=your-client-id;
Password=your-client-secret;
Encrypt=True;
TrustServerCertificate=False;
Connection Timeout=30;
Ключевые компоненты:
Server=tcp:your-server.database.windows.net,1433- Ваша конечная точка SQL ServerInitial Catalog=your-database- Имя вашей базы данныхAuthentication=Active Directory Service Principal- Указывает на аутентификацию субъекта-службыUser Id=your-client-id- Идентификатор вашего приложения (клиента) из регистрации EntraPassword=your-client-secret- Секрет вашего субъекта-службы
Из обсуждения на Stack Overflow подтверждается, что этот формат работает с приложениями .NET, однако вам необходимо убедиться, что ваш субъект-служба имеет соответствующие разрешения SQL Server.
Настройка ASP.NET Core Web API
1. Конфигурация параметров приложения
Добавьте вашу строку подключения в appsettings.json:
{
"ConnectionStrings": {
"DefaultConnection": "Server=tcp:your-server.database.windows.net,1433;Initial Catalog=your-database;Authentication=Active Directory Service Principal;User Id=your-client-id;Password=your-client-secret;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
},
"AzureAd": {
"ClientId": "your-client-id",
"ClientSecret": "your-client-secret",
"TenantId": "your-tenant-id"
}
}
2. Конфигурация DbContext
Настройте ваш DbContext для использования строки подключения:
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Ваши конфигурации сущностей
}
}
// В Startup.cs или Program.cs
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
3. Безопасная конфигурация в продакшене
В продакшене никогда не храните секреты непосредственно в файлах конфигурации. Вместо этого:
Вариант А: Использование Azure App Configuration
builder.Configuration.AddAzureAppConfiguration(options =>
{
options.Connect(builder.Configuration["AppConfig:ConnectionString"])
.ConfigureRefresh(refresh =>
{
refresh.Register("ConnectionStrings:DefaultConnection", refreshAll: true);
});
});
Вариант Б: Использование Azure Key Vault
Как упоминалось в результатах исследования от WebNetHelper, вы можете получать строки подключения к Azure SQL из Azure Key Vault:
builder.Configuration.AddAzureKeyVault(
new Uri(builder.Configuration["KeyVault:Endpoint"]),
new DefaultAzureCredential());
Лучшие практики безопасности
-
Никогда не коммитите секреты в систему контроля версий - Используйте Azure Key Vault или App Configuration для секретов продакшена
-
Используйте управляемые идентичности в Azure - Для приложений, размещенных в Azure, рассмотрите возможность использования управляемых идентичностей вместо субъектов-служб для лучшей безопасности:
csharp// Строка подключения для управляемой идентичности Server=tcp:your-server.database.windows.net,1433; Initial Catalog=your-database; Authentication=Active Directory Managed Identity; Encrypt=True; TrustServerCertificate=False; Connection Timeout=30; -
Реализуйте правильное вращение учетных данных - Регулярно обновляйте секреты вашего субъекта-службы
-
Используйте конфигурации, зависящие от среды - Имейте разные настройки для разработки, стейджинга и продакшена
-
Защитите ваш DbContext - Убедитесь, что ваш DbContext правильно настроен для использования безопасного обработки подключений
Рекомендации по развертыванию
Развертывание в Azure App Service
При развертывании в Azure App Service:
-
Настройте параметры приложения в портале Azure:
- Добавьте
ConnectionStrings:DefaultConnectionсо строкой подключения вашего субъекта-службы - Или используйте конфигурацию управляемой идентичности
- Добавьте
-
Установите переменные среды для конфиденциальных данных:
AzureAd:ClientIdAzureAd:ClientSecretAzureAd:TenantId
-
Включите управляемую идентичность (рекомендуется):
powershellaz webapp identity assign --resource-group your-resource-group --name your-app-name
Как упоминается в руководстве Microsoft Learn, этот подход создает строку подключения без пароля, которую может использовать ваше приложение.
Развертывание в контейнерах
Для контейнерных развертываний:
- Используйте Azure Key Vault для внедрения секретов в контейнеры
- Настраивайте строки подключения через переменные среды
- Реализуйте проверки работоспособности для проверки подключения к базе данных
Устранение распространенных проблем
1. Ошибки “Login failed for user”
Это обычно происходит, когда:
- У субъекта-службы нет разрешений SQL Server
- Неправильный формат строки подключения
- Истекшие или недействительные учетные данные
Решение: Убедитесь, что ваш субъект-служба получил доступ к SQL базе данных:
CREATE USER [your-client-id] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [your-client-id];
ALTER ROLE db_datawriter ADD MEMBER [your-client-id];
2. “Cannot set the AccessToken property if ‘Authentication’ has been specified”
Как видно из обсуждения на Stack Overflow, эта ошибка возникает при смешивании методов аутентификации. Убедитесь, что вы используете либо:
- Строку подключения с параметрами аутентификации, ИЛИ
- Программную установку токена без параметра аутентификации в строке подключения
3. Проблемы с проверкой сертификата
Если вы encountering ошибки SSL сертификата, убедитесь:
Encrypt=TrueустановленTrustServerCertificate=Falseдля продакшена- Правильная проверка цепочки сертификатов
4. Оптимизация производительности
Рассмотрите эти улучшения производительности:
- Используйте пул подключений
- Настройте соответствующие значения таймаута
- Реализуйте политики повторных попыток для временных сбоев
Заключение
Для успешной реализации аутентификации субъекта-службы для вашего ASP.NET Core Web API с SQL Server:
- Используйте правильный формат строки подключения с
Authentication=Active Directory Service Principal - Правильно настройте ваш субъект-службы с необходимыми разрешениями SQL Server
- Реализуйте безопасное управление учетными данными с использованием Azure Key Vault или управляемых идентичностей
- Настройте ваше ASP.NET Core приложение для правильного использования строки подключения
- Тщательно протестируйте как в среде разработки, так и в продакшене
Для оптимальной безопасности в развертываниях Azure рассмотрите возможность перехода на аутентификацию управляемой идентичности, как рекомендуется в документации Microsoft, что устраняет необходимость хранения секретов и обеспечивает лучшую безопасность для облачных нативных приложений.
Источники
- Microsoft Learn - Подключение к Azure SQL с аутентификацией Microsoft Entra и SqlClient
- Stack Overflow - Как создать строку подключения с регистрацией приложения/субъекта-службы для Web API с использованием EF Core и SQL Server с Microsoft Entra MFA
- Microsoft Learn - Безопасное подключение приложений .NET к базе данных Azure SQL с использованием управляемой идентичности
- Microsoft Learn - Развертывание приложения ASP.NET Core и базы данных Azure SQL
- WebNetHelper - Доступ к строке подключения Azure SQL из Azure Key Vault в ASP.NET Core API
- Stack Overflow - Какая строка подключения SQL Server работает с .NET Framework 4.5 в Microsoft Entra ID?