пятница, 7 сентября 2018 г.

Тестирование развёртывания Azure Web App c аутентификацией в Azure AD

Стало мне как-то скучно на работе и я придумал себе задачу - с помощью PowerShell настроить тестирование развертывания веб приложения в Azure Web Apps, написанного на AngularJS и использующего аутентификацию в Azure AD. Изначально задача выглядела очень понятно и просто. Я предполагал, что достаточно создать COM объект IE и с его помощью выполнить шаги:
1. Зайти на сайт приложения, развёрнутого в Azure Web App.

2. Редирект на login.microsoftonline.com

3. Выбрать "Использование другой учетной записи", если появилось соответствующая форма

4. Заполнить логин

5. Заполнить пароль

6. Отправить форму

7. Редирект на сайт приложения

8. Убедиться, что открылась корректная страница

PowerShell скрипт выглядит приблизительно так:

$UserName = "admin@linby.onmicrosoft.com"
$Password = "XXXyyyZZZ123"
$url = "https://wwwlinby.azurewebsites.net"

$ie = New-Object -com internetexplorer.application
$ie.visible = $TRUE #Временный шаг для отладки
$ie.navigate($url)
while ($ie.Busy -eq $true) { Start-Sleep -Milliseconds 1000}

#Подождем, пока отработает редирект
for ($i; $i -le 10; $i++) {
    if ($ie.LocationURL -notlike "*login.microsoftonline.com*") { Start-Sleep -Seconds 1} else {break}
}

#Проверяем, появилось ли окно "Pick an account"
if ($ie.Document.getElementById("otherTile")) {
    Write-Output "Click other acc"
    $ie.Document.getElementById("otherTile").Click()
}

#Login (email)
$ie.Document.getElementById("i0116").Value = $UserName
$ie.Document.getElementById("idSIButton9").Click()
while ($ie.Busy -eq $true) { Start-Sleep -Seconds 1}

#Password
$ie.Document.getElementById("i0118").Value = $Password
$ie.Document.getElementById("idSIButton9").Click()

#Смотрим результат в браузере
start-sleep -Seconds 10

$ie.Quit()
$ie = $NULL

Написано тут всё вроде как правильно, но работать этот скрипт отказыается. Так же после выполнения
$ie.Document.getElementById("i0116").Value = $UserName
мы наблюдаем такую картину:


А всё дело в том, что данная форма ожидает нажатия кнопки на клавиатуре (event keydown). Именно так и более никак :) Даже если начать делать ввод вручную, а потом дозаполнить форму, то при выполнении Submit() будет отправлена только та часть текста, которую мы ввели с клавиатуры. Как я понимаю, это своеобразная защита от брутфорса.

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

1 комментарий:

  1. Привет! Наткнулся случайно на твой пост, когда искал как решить эту проблему. В итоге, если еще интересно, ie после 9 не поддерживает fireevent и тебе нужно вызывать dispatchevent. Вот человек еще в 2016 сделал пример https://www.sepago.de/blog/unattended-login-to-onedrive-with-username-and-password-feasibility-test/

    ОтветитьУдалить