Использование powershell для входа в экран блокировки Auth0 (OWIN) - PullRequest
0 голосов
/ 31 октября 2018

У меня есть сценарий PowerShell, который нагревает наше веб-приложение .Net, использующее проверку подлинности с помощью форм. Я использовал Invoke-WebRequest и прочитал токен защиты от подделки, затем сделал POST с этим токеном и полями user / pass. Затем я сохранил сессию и смог запросить оставшиеся страницы для разогрева сайта.

В настоящее время в приложении реализован Auth0 с использованием OWIN / файлов cookie. Как я могу аутентифицировать мой сеанс PowerShell с новым именем входа Auth0?

РЕДАКТИРОВАТЬ: все заработало

1 Ответ

0 голосов
/ 02 ноября 2018

работает следующий код

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 '&#34;','"' | 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
    }
}
...