Подключение к базе данных Azure с помощью Active Directory-Universal с поддержкой проверки подлинности MFA в C # - PullRequest
0 голосов
/ 20 мая 2019

Мне нужен доступ к некоторой части данных таблицы SQL из консольного приложения c #. Мне нужна помощь для установки соединения с сервером из c #.

Детали базы данных:

 Server type : Database Engine
 Authentication : Active Directory-Universal with MFA support.

Также, пожалуйста, дайте мне знать, как мне указать свойства моего соединения?

1 Ответ

1 голос
/ 24 мая 2019

Существует 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
}
...