"Ошибка входа пользователя" ". SqlException при доступе к базе данных SQL Azure через MSI с реализацией кода EF

Я пытаюсь заставить приложение службы приложений Azure использовать идентификатор управляемой службы (MSI) и подключиться к базе данных SQL Azure, но приложение.NET Framework 4.7 не запускается при запуске со следующей ошибкой:

System.Data.SqlClient.SqlException: Login failed for user ''.
System.InvalidOperationException: This operation requires a connection to the 'master' database. Unable to create a connection to the 'master' database because the original database connection has been opened and credentials have been removed from the connection string. Supply an unopened connection. ---> System.Data.SqlClient.SqlException: Login failed for user ''.

Я добавил пакеты с нюгетами Microsoft.Azure.Services.AppAuthentication и Microsoft.IdentityModel.Clients.ActiveDirectory.

Я включил назначенную системой идентификацию для службы приложений на портале.

Я назначил группу пользователей Active Directory администратором Active Directory для SQL-сервера Azure.

Я выполнил команду CREATE USER "[user here]" FROM EXTERNAL PROVIDER в базе данных. Возможно, я забыл добавить / изменить роли для пользователя базы данных (MSI). Однако я не ожидал бы этой ошибки, если бы это было так.

DbContext приложения имеет два конструктора, один из которых выглядит следующим образом:

    public ApplicationDbContext(SqlConnection sqlConnection) : base(sqlConnection, true)
    {
        var isRunningLocal = string.IsNullOrEmpty(Environment.GetEnvironmentVariable("WEBSITE_SITE_NAME"));

        sqlConnection.ConnectionString = ConfigurationManager.ConnectionStrings[nameof(ApplicationDbContext)].ConnectionString;

        if (!isRunningLocal)
        {
            sqlConnection.AccessToken = new AzureServiceTokenProvider("RunAs=App").GetAccessTokenAsync("https://database.windows.net/").Result;
        }

        Database.SetInitializer<ApplicationDbContext>(null);
        //Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDbContext, Migrations.Configuration>());
    }

Обратите внимание, что есть два вызова Database.SetInitializer(), один с нулевым аргументом, а другой с аргументом MigrateDatabaseToLatestVersion и закомментированным. Приложение запускается при использовании первого варианта. Если я закомментирую первое и раскомментирую второе, то возникает исключение при запуске приложения.

Почему описание исключения содержит пустого ('') пользователя? Я подозреваю, что миграции Entity Framework (EF) конфликтуют с аутентификацией MSI в базе данных. Я наткнулся на один из нескольких результатов поиска, относящихся к моей проблеме, но ответа недостаточно:

https://github.com/MicrosoftDocs/azure-docs/issues/13801 Я хотел бы продолжить использовать миграции баз данных, как это всегда делала моя команда в прошлом. Эта проблема возникает, даже если база данных уже существует.

Любая помощь будет принята с благодарностью. Спасибо!

1 ответ

Можете ли вы попробовать использовать конструктор MigrateDatabaseToLatestVersion, который принимает в качестве аргумента значение bool, и установите для него значение true? Без этого он будет использовать информацию о соединении из контекста, созданного с использованием конструктора по умолчанию или зарегистрированной фабрики, если применимо

Согласно документации, если установлено значение true, инициализатор запускается с использованием информации о соединении из контекста, который инициировал инициализацию. В противном случае информация о соединении будет взята из контекста, созданного с использованием конструктора по умолчанию или зарегистрированной фабрики, если применимо

Другие вопросы по тегам