Функция Azure - подключение к базе данных Azure SQL с помощью интерактивной аутентификации Active Directory - PullRequest
0 голосов
/ 30 марта 2020

Я использую SqlClient в своей функции Azure. В настоящее время, когда я пытаюсь создать новый экземпляр, передавая строку подключения, я получаю следующее сообщение

Keyword not supported: 'authentication'

Моя строка подключения:

server=tcp:mydbserver.database.windows.net;database=mydb;UID=AnyString;Authentication=Active Directory Interactive

Моя azure функция имеет «Identity» настройка включена.

Мои другие. NET приложения, работающие в качестве AppService, отлично работают при подключении к той же БД, но используют EntityFramework

Я попытался удалить Authentication = Active Directory Interactive, а также добавьте следующую строку к соединению

 connection.AccessToken = new Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider().GetAccessTokenAsync("https://database.windows.net/").Result;

Но я просто получаю разные сообщения об ошибках, например, «Ошибка входа пользователя» или «Ошибка входа пользователя NT NT AUTHORITY \ ANONYMOUS LOGON»

Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Я добился успеха с помощью следующих шагов:

1. Предоставление Azure Администратора Active Directory для вашего Azure SQL Сервера базы данных .

Примечание. Убедитесь, что вы установили пользователя в качестве администратора AAD для Azure SQL Сервер.

2. Подключитесь к вашей Azure SQL базе данных с учетной записью AAD на шаге 1. Вы можете использовать SSMS или просто подключиться к своей базе данных с портала.

3. Добавьте участника службы и назначьте роль

CREATE USER [Azure_AD_principal_name] FROM EXTERNAL PROVIDER;
EXEC sp_addrolemember 'db_datareader', 'Azure_AD_principal_name';

4. Пример кода

string sqlResource = "https://database.windows.net/";
string tenantId = "e4c9ab4e-****-****-****-230ba2a757fb";
string serverName = "{server}.database.windows.net";
string databaseName = "{database}";

var token = new AzureServiceTokenProvider().GetAccessTokenAsync(sqlResource, tenantId).ConfigureAwait(false).GetAwaiter().GetResult();

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);


using (SqlConnection connection = new SqlConnection(sqlConnectionString))
{
    connection.AccessToken = token;
    using (SqlCommand command = new SqlCommand("SELECT Distinct TABLE_NAME FROM information_schema.TABLES", connection))
    {
        connection.Open();
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                Console.WriteLine(reader[0]);
            }
        }
    }
}

enter image description here

0 голосов
/ 02 апреля 2020

Я считаю, что свойство connection.AccessToken - единственный способ сделать это. NET Ядро согласно этому разговору .

Что касается ошибки, которую вы видите с этим, вероятно, потому что пользователь для управляемого удостоверения не был создан в базе данных. Для этого выполните шаги, описанные в этом разделе .

Вот справочник SQL для справки

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>];
GO

, где <identity-name> - имя управляемого удостоверения настроено в Azure AD.

...