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

Я пытаюсь заставить приложение службы приложений 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 Ответ

0 голосов
/ 22 января 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...