Я пытаюсь заставить приложение службы приложений 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
Я хотел бы продолжать использовать миграции баз данных, как это всегда делала моя команда в прошлом. Эта проблема возникает, даже если база данных уже существует.
Любая помощь будет принята с благодарностью. Спасибо!