Можно ли использовать Invoke Webrequest для входа на сайт, использующий аутентификацию Azure AD B2C? - PullRequest
1 голос
/ 25 мая 2019

Я пытаюсь настроить свой сборочный сервер на прогрев моего сайта с помощью скрипта 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 Ответ

0 голосов
/ 26 мая 2019

У меня не было причин связываться с Azure AD B2C, поэтому я не знаю, что это за сайт или что вы можете на нем делать.Тем не менее, что касается ...

Так что я предполагаю, что мой вопрос заключается в том, можно ли вызвать нажатие кнопки с помощью PowerShell?Когда я также хочу, чтобы скрипт выполнялся на моем сервере сборки, где IE может быть недоступен

... простой ответ - да, как обсуждалось и продемонстрировано в статье ... Обучение PowerShell для нажатия .Переделайте статью для полного объяснения

В редакторе 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.

Наконец, вот что вы можетехочу взглянуть на.

pQuery

Этот модуль предназначен для создания переменной, которую мы можем использовать как jQuery-подобный синтаксис для выполнения jQuery-подобногоманипуляции на сайте.

...