НейроАгент

Полное руководство: строка подключения Service Principal

Узнайте, как создать безопасную строку подключения с использованием App Registration/Service Principal для ASP.NET Core Web API с EF Core и SQL Server. Избегайте запросов браузера в продакшене с правильной настройкой аутентификации.

Как создать строку подключения с использованием регистрации приложения/субъекта-службы для 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

Microsoft Entra (ранее Azure Active Directory) поддерживает несколько режимов аутентификации для подключений к SQL Server, каждый из которых подходит для разных сценариев:

  1. Active Directory Interactive - Открывает браузер для запроса аутентификации пользователя (то, что вы используете локально)
  2. Active Directory Service Principal - Использует идентификатор клиента и секрет субъекта-службы для программной аутентификации
  3. Active Directory Managed Identity - Использует управляемую идентичность приложения (идеально для приложений, размещенных в Azure)
  4. Active Directory Integrated - Использует проверку подлинности Windows
  5. Active Directory Password - Использует имя пользователя и пароль

Для вашего сценария развертывания приложения Active Directory Service Principal является подходящим выбором, так как он не требует взаимодействия с пользователем и может быть автоматизирован с использованием учетных данных субъекта-службы.

Согласно документации Microsoft, режим аутентификации Active Directory Service Principal специально разработан для приложений, которым необходимо аутентифицироваться как субъект-служба, что делает его идеальным для развертывания вашего ASP.NET Core Web API.

Создание правильной строки подключения

На основе ваших учетных данных и результатов исследования, вот правильный формат строки подключения для вашего субъекта-службы:

csharp
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 Server
  • Initial Catalog=your-database - Имя вашей базы данных
  • Authentication=Active Directory Service Principal - Указывает на аутентификацию субъекта-службы
  • User Id=your-client-id - Идентификатор вашего приложения (клиента) из регистрации Entra
  • Password=your-client-secret - Секрет вашего субъекта-службы

Из обсуждения на Stack Overflow подтверждается, что этот формат работает с приложениями .NET, однако вам необходимо убедиться, что ваш субъект-служба имеет соответствующие разрешения SQL Server.

Настройка ASP.NET Core Web API

1. Конфигурация параметров приложения

Добавьте вашу строку подключения в appsettings.json:

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 для использования строки подключения:

csharp
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

csharp
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:

csharp
builder.Configuration.AddAzureKeyVault(
    new Uri(builder.Configuration["KeyVault:Endpoint"]),
    new DefaultAzureCredential());

Лучшие практики безопасности

  1. Никогда не коммитите секреты в систему контроля версий - Используйте Azure Key Vault или App Configuration для секретов продакшена

  2. Используйте управляемые идентичности в 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;
    
  3. Реализуйте правильное вращение учетных данных - Регулярно обновляйте секреты вашего субъекта-службы

  4. Используйте конфигурации, зависящие от среды - Имейте разные настройки для разработки, стейджинга и продакшена

  5. Защитите ваш DbContext - Убедитесь, что ваш DbContext правильно настроен для использования безопасного обработки подключений

Рекомендации по развертыванию

Развертывание в Azure App Service

При развертывании в Azure App Service:

  1. Настройте параметры приложения в портале Azure:

    • Добавьте ConnectionStrings:DefaultConnection со строкой подключения вашего субъекта-службы
    • Или используйте конфигурацию управляемой идентичности
  2. Установите переменные среды для конфиденциальных данных:

    • AzureAd:ClientId
    • AzureAd:ClientSecret
    • AzureAd:TenantId
  3. Включите управляемую идентичность (рекомендуется):

    powershell
    az webapp identity assign --resource-group your-resource-group --name your-app-name
    

Как упоминается в руководстве Microsoft Learn, этот подход создает строку подключения без пароля, которую может использовать ваше приложение.

Развертывание в контейнерах

Для контейнерных развертываний:

  1. Используйте Azure Key Vault для внедрения секретов в контейнеры
  2. Настраивайте строки подключения через переменные среды
  3. Реализуйте проверки работоспособности для проверки подключения к базе данных

Устранение распространенных проблем

1. Ошибки “Login failed for user”

Это обычно происходит, когда:

  • У субъекта-службы нет разрешений SQL Server
  • Неправильный формат строки подключения
  • Истекшие или недействительные учетные данные

Решение: Убедитесь, что ваш субъект-служба получил доступ к SQL базе данных:

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:

  1. Используйте правильный формат строки подключения с Authentication=Active Directory Service Principal
  2. Правильно настройте ваш субъект-службы с необходимыми разрешениями SQL Server
  3. Реализуйте безопасное управление учетными данными с использованием Azure Key Vault или управляемых идентичностей
  4. Настройте ваше ASP.NET Core приложение для правильного использования строки подключения
  5. Тщательно протестируйте как в среде разработки, так и в продакшене

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

Источники

  1. Microsoft Learn - Подключение к Azure SQL с аутентификацией Microsoft Entra и SqlClient
  2. Stack Overflow - Как создать строку подключения с регистрацией приложения/субъекта-службы для Web API с использованием EF Core и SQL Server с Microsoft Entra MFA
  3. Microsoft Learn - Безопасное подключение приложений .NET к базе данных Azure SQL с использованием управляемой идентичности
  4. Microsoft Learn - Развертывание приложения ASP.NET Core и базы данных Azure SQL
  5. WebNetHelper - Доступ к строке подключения Azure SQL из Azure Key Vault в ASP.NET Core API
  6. Stack Overflow - Какая строка подключения SQL Server работает с .NET Framework 4.5 в Microsoft Entra ID?