Сбой начального метода миграции TFS CF из-за того, что код пытается получить доступ к хранилищу ключей Azure - PullRequest
0 голосов
/ 05 ноября 2018

Мы настраиваем хранилище ключей Azure для использования с всегда зашифрованными столбцами в SQL. Я получил все настройки кода и миграции CF, update-database, отлично работают на моем локальном компьютере, но когда я регистрируюсь и развертываю TFS, он терпит неудачу, заявляя, что у него есть проблемы с System.Net.Http. Я попробовал каждое предложение в Интернете, но не могу заставить его работать в TFS даром. Любая помощь будет принята с благодарностью. Журналы и начальный код ниже.

Журналы TFS 2018-11-04T23: 30: 56.1072858Z ## [раздел] Запуск: обновление БД с использованием CF

2018-11-04T23: 30: 56.1075915Z ==================================== =========================================

2018-11-04T23: 30: 56.1076031Z Задача: Командная строка

2018-11-04T23: 30: 56.1076134Z Описание: Запустите сценарий командной строки, используя cmd.exe в Windows и bash в macOS и Linux.

2018-11-04T23: 30: 56.1076245Z Версия: 2.142.1

2018-11-04T23: 30: 56.1076334Z Автор: Microsoft Corporation

2018-11-04T23: 30: 56.1076433Z Справка: Дополнительная информация

2018-11-04T23: 30: 56.1076553Z ==================================== =========================================

2018-11-04T23: 30: 57.2703277Z Создание сценария.

2018-11-04T23: 30: 57.2720721Z Содержание сценария:

2018-11-04T23: 30: 57.3000149Z migrate.exe "Data.dll" / ConnectionString: "источник данных = XXX.XXX.XXX.XXX; исходный каталог = Dev; встроенная безопасность = False; идентификатор пользователя = ID ; Пароль = XXXX; Настройка шифрования столбца = включена " /connectionProviderName:"System.Data.SqlClient "/ verbose /startupConfigurationFile="..\..\..\Website\web.config"

2018-11-04T23: 30: 57.3444734Z ## [команда] "C: \ Windows \ system32 \ cmd.exe" / D / E: ВКЛ / V: ВЫКЛ / S / C "ВЫЗОВ" C: \ agent_work_temp \ eb1b5f18-6061-405e-b5af-4648a8112358.cmd ""

2018-11-04T23: 31: 01.6622161Z VERBOSE: Целевая база данных: «Dev» (источник данных: XXX.XXX.XXX.XXX, поставщик: System.Data.SqlClient, происхождение: явное).

2018-11-04T23: 31: 03.2434372Z Нет ожидающих явных миграций.

2018-11-04T23: 31: 03.3614105Z Метод бегущего семени.

2018-11-04T23: 31: 03.7846850Z System.Data.Entity.Migrations.Design.ToolingException: не удалось загрузить файл или сборку 'System.Net.Http, версия = 4.2.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a 'или одна из его зависимостей. Система не может найти указанный файл.

2018-11-04T23: 31: 03.7847574Z в System.Data.Entity.Migrations.Design.ToolingFacade.Run (бегун BaseRunner)

2018-11-04T23: 31: 03.7847797Z в System.Data.Entity.Migrations.Console.Program.Run ()

2018-11-04T23: 31: 03.7847985Z в System.Data.Entity.Migrations.Console.Program.Main (String [] args)

2018-11-04T23: 31: 03.7848435Z ОШИБКА: не удалось загрузить файл или сборку 'System.Net.Http, версия = 4.2.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a' или одна из ее зависимостей. Система не может найти указанный файл.

2018-11-04T23: 31: 03.9076355Z ## [error] Cmd.exe завершен с кодом «1».

2018-11-04T23: 31: 03.9591665Z ## [раздел] Окончание: обновление БД с использованием CF

Код в методе семени:

    _clientCredential = new ClientCredential(applicationId, clientKey);
        SqlColumnEncryptionAzureKeyVaultProvider azureKeyVaultProvider =
           new SqlColumnEncryptionAzureKeyVaultProvider(GetToken);
        Dictionary<string, SqlColumnEncryptionKeyStoreProvider> providers =
           new Dictionary<string, SqlColumnEncryptionKeyStoreProvider>();
        providers.Add       (SqlColumnEncryptionAzureKeyVaultProvider.ProviderName,           azureKeyVaultProvider);
        SqlConnection.RegisterColumnEncryptionKeyStoreProviders(providers);

    public async static Task<string> GetToken(string authority, string  resource, string scope)
    {
        var authContext = new Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext(authority);
        AuthenticationResult result = await authContext.AcquireTokenAsync(resource, _clientCredential);
        if (result == null)
            throw new InvalidOperationException("Failed to obtain the access token");
        return result.AccessToken;
    }
...