Существует 2 различных сценария входа в базу данных.
1) Пользователь входит в систему со своей учетной записью, и вы используете этот токен для аутентификации в базе данных SQL.В этом случае вы можете использовать стандартные всплывающие окна входа в систему, которые будут обрабатывать часть MFA для вас.
2) Либо у пользователя нет прав доступа к БД (большинство стандартных веб-приложений являются примером этого), либоВы создаете автоматизированный сервис, который должен войти в БД.Поскольку причина для MFA состоит в том, чтобы пользователь выполнил какое-то действие, которое не может выполнить машина, например, введя код со своего мобильного телефона, автоматические входы в систему не будут работать с MFA.
Если вы находитесь во второмВ этом случае вам потребуется создать учетную запись принципа службы, которая не защищена MFA, чтобы приложение могло войти в систему.Вместо имени пользователя и пароля приложение получает уникальный appId и appSecret, чтобы использовать их для доступа к базе данных.Вы можете добавить дополнительную защиту, поместив секрет в хранилище ключей и ограничив доступ этого приложения только определенными ресурсами, которые ему необходимы для работы.
Обратите внимание, что в этом случае мы не передаем имя пользователя и парольв строке подключения.Вместо этого мы получаем токен отдельно перед добавлением его в соединение.
string serverName = "myserver.database.windows.net";
string databaseName = "test";
string clientId = "xxxxxx-xxxxx-xxxxx-xxxx-xxxx";
string aadTenantId = "xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxxxx";
string clientSecretKey = "xxxxx/xxxxxx/xxxxx";
string sqlConnectionString = String.Format("Data Source=tcp:{0},1433;Initial Catalog={1};Persist Security Info=False;Connect Timeout=30;Encrypt=True;TrustServerCertificate=False", serverName, databaseName);
string AadInstance = "https://login.windows.net/{0}";
string ResourceId = "https://database.windows.net/";
AuthenticationContext authenticationContext = new AuthenticationContext(string.Format(AadInstance, aadTenantId));
ClientCredential clientCredential = new ClientCredential(clientId, clientSecretKey);
DateTime startTime = DateTime.Now;
Console.WriteLine("Time " + String.Format("{0:mm:ss.fff}", startTime));
AuthenticationResult authenticationResult = authenticationContext.AcquireTokenAsync(ResourceId, clientCredential).Result;
DateTime endTime = DateTime.Now;
Console.WriteLine("Got token at " + String.Format("{0:mm:ss.fff}", endTime));
Console.WriteLine("Total time to get token in milliseconds " + (endTime - startTime).TotalMilliseconds);
using (var conn = new SqlConnection(sqlConnectionString))
{
conn.AccessToken = authenticationResult.AccessToken;
//DO STUFF
}