Можно ли использовать Invoke Webrequest для входа на сайт, использующий аутентификацию Azure AD B2C?
Я пытаюсь настроить свой сборочный сервер на прогрев моего сайта с помощью скрипта PowerShell, который посещает сайт и входит в систему. Весь сайт за логином.
Мой веб-сайт использует Azure AD B2C для проверки подлинности и был настроен с помощью руководства по началу работы от Microsoft: https://github.com/AzureADQuickStarts/B2C-WebApp-OpenIdConnect-DotNet
Когда я вхожу через браузер, все работает как положено.
Мой текущий код для входа выглядит так:
$session = Get-AuthenticatedSession $DomainName $config.authenticationDetails $UserName $Password
Function Get-AuthenticatedSession {
param(
[Parameter(Mandatory=$true,Position=0)]
[string]$domainName,
[Parameter(Mandatory=$true,Position=1)]
[object]$authenticationDetails,
[Parameter(Mandatory=$true,Position=2)]
[string]$username,
[Parameter(Mandatory=$true,Position=3)]
[string]$password
)
# Login - to create web session with authorisation cookies
$loginPage = "$domainName$($authenticationDetails.url)"
Write-Host "Getting Login Page $loginPage"
try{
$login = Invoke-WebRequest $loginPage -SessionVariable webSession -TimeoutSec 600 -UseBasicParsing
}catch{
Write-Host "First attempt failed with $($_.Exception.Response.StatusCode.value__) , retrying"
$login = Invoke-WebRequest $loginPage -SessionVariable webSession -TimeoutSec 600 -UseBasicParsing
}
Write-Host "Got Login Page, filling out form"
$fields = @{}
$fields["$($authenticationDetails.userNameField)"] = $username
$fields["$($authenticationDetails.passwordField)"] = $password
Write-Host "logging in"
$request = Invoke-WebRequest -Uri $loginPage -WebSession $webSession -Method POST -Body $form -TimeoutSec 600| Out-Null
$webSession
Write-Host "login done"
}
Это мой код для запроса страницы за входом в систему, которая запускается потом:
foreach ($page in $config.urls) {
RequestPage "$DomainName$($page.url)" $session
}
Function RequestPage {
param(
[Parameter(Mandatory=$true,Position=0)]
[string]$url,
[Parameter(Mandatory=$true,Position=1)]
[object]$webSession
)
Get-Date
Write-Host "requesting $url ..."
try { $request = Invoke-WebRequest $url -WebSession $webSession -TimeoutSec 60000 -UseBasicParsing} catch {
$status = $_.Exception.Response.StatusCode.Value__
if ($status -ne 200){
Write-Host "ERROR Something went wrong while requesting $url" -foregroundcolor red
}
}
Write-Host $request
Get-Date
Write-Host "Done"
Write-Host ""
}
Проблема в том, что сценарий, кажется, не входит в систему правильно. Всякий раз, когда я запрашиваю страницу за входом в систему, я всегда получаю html страницы входа в систему. Любая помощь высоко ценится!
РЕДАКТИРОВАТЬ - Кажется, что на странице нет элемента FORM - дох! Фактический вход - это кнопка-элемент с прикрепленным событием щелчка JavaScript. Страница входа размещена на Microsoft, поэтому я мало контролирую элементы DOM:
<div class="buttons">
<button id="next" tabindex="1">Sign in</button>
</div>
Поэтому я предполагаю, что мой вопрос заключается в том, можно ли вызвать нажатие кнопки с помощью PowerShell? Когда я также хочу, чтобы скрипт выполнялся на моем сервере сборки, где IE может быть недоступен
1 ответ
У меня не было причин связываться с Azure AD B2C, поэтому я не знаю, что это за сайт или что вы можете на нем делать. Однако, что касается...
Поэтому я предполагаю, что мой вопрос заключается в том, можно ли вызвать нажатие кнопки с помощью PowerShell? Когда я также хочу, чтобы скрипт выполнялся на моем сервере сборки, где IE может быть недоступен
... простой ответ, да, как обсуждалось и продемонстрировано в статье... Обучение PowerShell для Click. Красная статья для полного объяснения
В редакторе PowerShell - в этом случае я использую ISE - конечно же и в VSCode.
# View the page live to se what it does - just do stuff
Start-Process 'http://www.minasi.com/addit.htm'
# Now, inspect the site page/form.
# View the page code to see what is there - If in the ISE
$minasi = Invoke-WebRequest -Uri 'http://www.minasi.com/addit.htm'
$minasi.Content | Out-ISETab
$minasi.AllElements | Out-ISETab
$minasi.Forms | Out-ISETab
$minasi.Forms.Fields | Out-ISETab
$minasi.InputFields | Out-ISETab
# View the page code to see what is there - If in VSCode
$minasi = Invoke-WebRequest -Uri 'http://www.minasi.com/addit.htm'
$minasi.Content | New-EditorFile
$minasi.AllElements | New-EditorFile
$minasi.Forms | New-EditorFile
$minasi.Forms.Fields | New-EditorFile
$minasi.InputFields | New-EditorFile
# Interact with the page to achieve the same results as GUI would by going direct to the 'results page' not the 'form page'.
$MethodPostURI = 'http://www.minasi.com/addit-worker.asp'
$Body ='addend1=3&addend2=9&B1=SUBMIT%21'
$page = Invoke-WebRequest $MethodPostURI -body $Body -method POST
$page.content
# You can also find elements by looping to find something specific, like the below...
$minasi.AllElements.FindById('SomeIdNameString')
# Or
$SubmitElement = $minasi.AllElements |
Where{
$PSItem.tagName -eq 'INPUT' -and
$PSItem.value -eq 'SUBMIT!'
}
$SubmitElement # The use dot lookup to see if there is a click option.
Наконец, вот что вы можете посмотреть.
Этот модуль предназначен для создания переменной, которую мы можем использовать jQuery-подобный синтаксис для выполнения jQuery-подобных манипуляций на веб-сайте.