Я пытаюсь настроить подключение из службы приложений Azure к базе данных Azure SQL с помощью управляемого удостоверения (назначено системой)
Вот настройка: Две службы приложений Azure, одна для приложения и одна для API в одном плане обслуживания. У меня есть SQL-сервер в Azure с двумя azure sql db. В службах приложений включено назначенное системой управляемое удостоверение. У меня есть настройки приложения для нескольких сред как в проекте (приложение, так и API).
appsettings.json, appsettings.development.json, appsettings.acceptance.json, appsettings.production.json
Когда я изучил Kudu после развертывания своего приложения в службе приложений из конвейера yaml, я увидел, что все файлы настроек приложения доступны.
Конфигурация -> параметр приложения в службе приложений Azure не имеет никаких переменных, кроме ключа инструментария анализа приложений, который я добавляю (IaC) в шаблон при подготовке службы приложений в Azure.
Управляемому удостоверению для обеих служб приложений были назначены роли базы данных в обеих базах данных db1 и db2.
CREATE USER [<identity-name>] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [<identity-name>];
ALTER ROLE db_datawriter ADD MEMBER [<identity-name>];
ALTER ROLE db_ddladmin ADD MEMBER [<identity-name>];
В моем файле настройки приложения json у меня есть две строки подключения для обеих БД.
"connectionStrings": {
"DB1Context": "Server=myserver.database.windows.net;Authentication=Active Directory Managed Identity;Encrypt=True;Database=db1;",
"DB2Context": "Server=myserver.database.windows.net;Authentication=Active Directory Managed Identity;Encrypt=True;Database=db2;",
Program.cs (чтение строки подключения)
builder.Services.AddHangfire(options =>
{
options.UseSqlServerStorage(builder.Configuration.GetConnectionString("DB1Context"),
new SqlServerStorageOptions
{
});
});
builder.Services.AddDbContext<DbContext>(options=>
{
options.UseSqlServer(builder.Configuration.GetCOnnectionString("DB2Context"));
});
Вопросы:
При выполнении dotnet webapp.dll из консоли (в Azure) я получаю следующую ошибку: Необработанное исключение. System.ArgumentException.Keyword не поддерживается: «аутентификация». Примечание. Я использую EFCore, а также добавил пакет Microsoft.Data.SqlClient (последняя версия 5.x.x) в оба проекта.
Если все файлы настроек приложения будут отправлены (как показано в Kudu), какие настройки приложения будут прочитаны? appsettings.json или любая другая среда? Насколько я понимаю, это должен быть appsettings.json.
Я пробовал другие варианты строки подключения с измененным значением аутентификации (по умолчанию, интегрированным и т. д.), но вижу ту же ошибку. Я также попытался добавить строку подключения в Службу приложений Azure -> Конфигурация -> параметр приложения (также в разделе строки подключения), но получаю ту же ошибку. Насколько я понимаю, предпочтение должно быть из раздела «Конфигурация», а затем из файла настроек приложения.
Будет ли лучшим способом обработки параметров приложения для разных сред использовать только файлы appsettings.json и appsettings.development.json в решении и создавать для всех сред при подготовке службы приложений Azure (шаблон IaC), файлы параметров для разных сред могут есть необходимые настройки (извлекаются из хранилища ключей)? Или любой другой способ лучше, проще и безопаснее?
Понятно, в следующий раз точно разделю вопросы. Спасибо за объяснение. Версия Hangfire — 1.7.32 (Hangfire.AspNetCore и Hangfire.SqlServer).
Не могли бы вы составить новый вопрос для № 2 и № 4? Лучше отвечать на них отдельно от #1
Конечно, я сразу же добавлю новый вопрос
Я опубликовал его как отдельный вопрос: Параметры приложения — Служба приложений Azure (несколько сред) stackoverflow.com/questions/76031818/…
Hangfire.SqlServer 1.7.34 по-прежнему использует System.Data.SqlClient вместо Microsoft.Data.SqlClient. Однако вы можете указать ему использовать пространство имен Microsoft.Data:
.UseSqlServerStorage(
() => new Microsoft.Data.SqlClient.SqlConnection(builder.Configuration.GetConnectionString("DB1Context")));
См. эту проблему и эту, которые относятся к фрагменту кода выше.
Я не понизил голос, но я полагаю, что кто-то сделал это, потому что вы задали слишком много вопросов в одном. Один относится к соединению, а другой к тому, как определяются настройки. Вы можете разделить это на 2 отдельных вопроса. Тем не менее, какую версию Hangfire вы используете?