Использование powershell для входа в экран блокировки Auth0 (OWIN)
У меня есть сценарий PowerShell, который нагревает наше веб-приложение.Net, использующее проверку подлинности с помощью форм. я использовал Invoke-WebRequest
и прочитал токен защиты от подделки, затем сделал POST с этим токеном и полями user/pass. Затем я сохранил сессию и смог запросить оставшиеся страницы для разогрева сайта.
Мы внедрили Auth0 в приложение сейчас, используя OWIN/ куки. Как я могу аутентифицировать мой сеанс PowerShell с новым именем входа Auth0?
РЕДАКТИРОВАТЬ: получил это работает
1 ответ
Следующий код работает
function LoginAuth0
{
LogAction 'Logging into Auth0'
$url = BnUrl('/auth/login?fromSignIn=True')
$login = Invoke-WebRequest $url -UseBasicParsing -SessionVariable Script:session -Method 'GET'
$match = [regex]::Match($login.Content, "var config = JSON\.parse\(decodeURIComponent\(escape\(window.atob\('([a-zA-Z0-9=]+)'\)\)\)\);")
if($match.Success)
{
$configDataBase64 = $match.captures.groups[1].value
}
if( -not $configDataBase64 )
{
LogError('Could not get config data');
Exit 1
}
$configDataUriEncoded = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($configDataBase64))
$configDecoded = [System.Web.HttpUtility]::UrlDecode($configDataUriEncoded)
$lockConfig = ($configDecoded | ConvertFrom-Json)
$fields = @{
'redirect_uri' = BnUrl('/signin-auth0')
'tenant' = $Script:config.auth0_tenant
'response_type' = 'code id_token'
'connection' = 'Username-Password-Authentication'
'sso' = 'true'
'response_mode' = 'form_post'
'_intstate' = 'deprecated'
'allow_signup' = 'false'
'x-client-_sku' = 'ID_NET461'
'allow_login' = 'true'
'scope' = 'openid profile'
'x-client-ver' = '5.3.0.0'
'protocol' = 'oauth2'
'client_id' = $lockConfig.clientID
'username' = $Script:config.site_user
'password' = $Script:config.site_pass
'_csrf' = $lockConfig.internalOptions._csrf
'nonce' = $lockConfig.internalOptions.nonce
'state' = $lockConfig.internalOptions.state
}
$post_url = "https://$($Script:config.auth0_tenant).auth0.com/usernamepassword/login"
$post_json = Invoke-WebRequest $post_url -UseBasicParsing -WebSession $Script:session -Method 'POST' -ContentType 'application/json' -Body ($fields|ConvertTo-Json)
$match = [regex]::Match($post_json.Content, '<input\s+type="\w+"\s+name="wresult"\s+value="([^>]+)">')
if( -not $match.Success )
{
LogError('Could not find wresult')
Exit 1
}
$wresult = $match.captures.groups[1].value
$match = [regex]::Match($post_json.Content, '<input\s+type="\w+"\s+name="wctx"\s+value="([^>]+)">')
if( -not $match.Success )
{
LogError('Could not find wctx')
Exit 1
}
$wctx = $match.captures.groups[1].value -replace '"','"' | ConvertFrom-Json
$formFields = @{
wa = 'wsignin1.0'
wresult = $wresult
wctx = $wctx | ConvertTo-Json -Compress
}
$url = "https://$($Script:config.auth0_tenant).auth0.com/login/callback"
$post_form = Invoke-WebRequest $url -UseBasicParsing -WebSession $Script:session -Method 'POST' -ContentType 'application/x-www-form-urlencoded' -Body $formFields
$match = [regex]::Match($post_form.Content, '<input\s+type="\w+"\s+name="code"\s+value="([^>]+)"\s*/>')
if( -not $match.Success )
{
LogError('Could not find code')
Exit 1
}
$code = $match.captures.groups[1].value
$match = [regex]::Match($post_form.Content, '<input\s+type="\w+"\s+name="id_token"\s+value="([^>]+)"\s*/>')
if( -not $match.Success )
{
LogError('Could not find code')
Exit 1
}
$token = $match.captures.groups[1].value
$match = [regex]::Match($post_form.Content, '<input\s+type="\w+"\s+name="state"\s+value="([^>]+)"\s*/>')
if( -not $match.Success )
{
LogError('Could not find code')
Exit 1
}
$state = $match.captures.groups[1].value
$formFields = @{
code = $code
id_token = $token
state = $state
}
$url = BnUrl('/signin-auth0')
$result = Invoke-WebRequest $url -UseBasicParsing -WebSession $Script:session -Method 'POST' -ContentType 'application/x-www-form-urlencoded' -Body $formFields
if($result.StatusCode -eq 200)
{
LogOk
}
else
{
LogError('failed to login')
Exit 1
}
}