New-SAMLInteractive.ps1
<#PSScriptInfo .VERSION 1.1 .GUID b5d2db17-021a-4762-b3b1-a5220708a7e9 .AUTHOR BadRequests .COMPANYNAME .COPYRIGHT .TAGS .LICENSEURI .PROJECTURI .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES .PRIVATEDATA #> <# .DESCRIPTION Starts an interactive login to retrieve SAML token. #> [CmdletBinding()] param( [Parameter(Mandatory=$true)] [string] $LoginIDP ) Begin{ $RegEx = '(?i)name="SAMLResponse"(?: type="hidden")? value=\"(.*?)\"(?:.*)?\/>' Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Web } Process{ # create window for embedded browser $form = New-Object Windows.Forms.Form $form.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen; $form.Width = 640 $form.Height = 700 $form.showIcon = $false $web = New-Object Windows.Forms.WebBrowser $web.Size = $form.ClientSize $web.Anchor = "Left,Top,Right,Bottom" $web.ScriptErrorsSuppressed = $true $form.Controls.Add($web) $web.Navigate($LoginIDP) $web.add_Navigating({ if ($web.DocumentText -match "SAMLResponse"){ $_.cancel = $true if ($web.DocumentText -match $RegEx){ $form.Close() $Script:SAMLResponse = $(($Matches[1] -replace '+', '+') -replace '=', '=') } } }) # show browser window, waits for window to close if($form.ShowDialog() -ne "OK") { if ($null -ne $Script:SAMLResponse){ Write-Output $Script:SAMLResponse $form.Close() Remove-Variable -Name SAMLResponse -Scope Script -ErrorAction SilentlyContinue } Else{ throw "SAMLResponse not matched" } } } End{ $form.Dispose() } |