"Ошибка входа пользователя" ". 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, инициализатор запускается с использованием информации о соединении из контекста, который инициировал инициализацию. В противном случае информация о соединении будет взята из контекста, созданного с использованием конструктора по умолчанию или зарегистрированной фабрики, если применимо