Не удается подключиться к Azure SQL с помощью PowerShell в приложении-функции с поддержкой MSI

Недавно созданная функция приложения работает. Приложение функции содержит функции C# и PowerShell, которые работают, как и ожидалось, с включенным MSI.

Код PowerShell ниже, полный код на Github

Write-Output "PowerShell Timer trigger function executed at:$(get-date)";

# Get MSI AUTH
$endpoint = $env:MSI_ENDPOINT
$secret = $env:MSI_SECRET
$sqlTokenURI = "https://database.windows.net&api-version=2017-09-01"
$header = @{'Secret' = $secret}
$authenticationResult = Invoke-RestMethod -Method Get -Headers $header -Uri ($endpoint +'?resource=' +$sqlTokenURI)

# CONNECT TO SQL
$SqlServer = $env:SQL_SERVER_NAME
$SqlServerPort = 1433
$Database = "azuredwmonitordb"
$Conn = New-Object System.Data.SqlClient.SqlConnection("Data Source=tcp:$($SqlServer),1433; Initial Catalog=$($Database);")
$Conn.AccessToken = $authenticationResult.access_token

# Open the SQL connection 
$Conn.Open() 

$Cmd=new-object system.Data.SqlClient.SqlCommand("SELECT @@SERVERNAME", $Conn) 
$Cmd.CommandTimeout=120 

# Execute the SQL command 
$Ds=New-Object system.Data.DataSet 
$Da=New-Object system.Data.SqlClient.SqlDataAdapter($Cmd) 
[void]$Da.fill($Ds) 

# Output the count 
$Ds.Tables.Column1 

# Close the SQL connection 
$Conn.Close()

Обе функции реализуют одну и ту же логику:

  1. Получить токен авторизации от провайдера
  2. Подключитесь к серверу Azure SQL с помощью токена

Однако при использовании функции PowerShell первый шаг первый работает, но при попытке установить соединение на втором шаге я получаю следующую ошибку:

Исключение при выполнении функции: Functions.dm_pdw_exec_sessions. Microsoft.Azure.WebJobs.Script: ошибка сценария PowerShell. System.Management.Automation: Исключение, вызывающее "Open" с аргументом (ами) "0": "Ошибка входа для пользователя 'NT AUTHORITY\ANONYMOUS LOGON'.". Поставщик данных.Net SqlClient: Ошибка входа пользователя 'NT AUTHORITY \ ANONYMOUS LOGON

Я видел это в прошлом, когда аутентификация AAD не была правильно включена для SQL-сервера Azure (пользователь не в master), но здесь это не так.

2 ответа

Проблема в URI ресурса - отсутствует косая черта. Вместо:

https://database.windows.net/

Так должно быть

https://database.windows.net/

Поэтому измените ваш $sqlTokenURI на это, и оно должно работать:

$sqlTokenURI = " https://database.windows.net/&api-version=2017-09-01"

Этот сценарий аутентификации в настоящее время не поддерживается.

Часто задаваемые вопросы и известные проблемы с идентификатором управляемой службы (MSI) для Azure Active Directory

Работает ли MSI с библиотекой аутентификации Active Directory (ADAL) или библиотекой аутентификации Microsoft (MSAL)?

Нет, MSI еще не интегрирован с ADAL или MSAL. Подробные сведения о получении токена MSI с использованием конечной точки MSI REST см. В разделе Как использовать идентификатор управляемой службы (MSI) Azure VM для получения токена.

Обратная связь с пользователями из Веб-приложений

Если мы хотим использовать токен AAD для доступа к Azure SQL, нам необходимо подготовить администратора Azure Active Directory для сервера базы данных SQL Azure. И создайте пользователя автономной базы данных, представляющего приложение, которое подключается с помощью токена Azure AD.

CREATE USER [appName] FROM EXTERNAL PROVIDER;

Моя учетная запись Azure не является глобальным администратором. Я обнаружил, что не могу создать пользователя. Если вы являетесь учетной записью глобального администратора Azure, вы можете попробовать. Я собираюсь получить помощь от команды Microsoft Azure, если я получу ответ, я буду обновлять здесь.

Вы также можете оставить свой отзыв команде Azure.

Ниже приведены мои тестовые шаги.

1.После включения функции Azure мы можем обнаружить, что она создает приложение AD, но его нет в моем зарегистрированном приложении. Более подробную информацию см. На снимке экрана.

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

3. Подключитесь к Azure Sql и создайте пользователь автономной базы данных, представляющий приложение.

Создание [tomtestmsi]... (62,1): SQL72014: поставщик данных SNet SqlClient: Msg 33130, уровень 16, состояние 1, строка 1 Принципал "xxxx" не найден или этот основной тип не поддерживается. (62,0): SQL72045: ошибка выполнения скрипта. Выполненный скрипт: CREATE USER [xxxx] FOR EXTERNAL PROVIDER; Произошла ошибка во время выполнения пакета.

Другие вопросы по тегам