Вы получаете это поведение из-за перенаправления;при выполнении этого дополнительного запроса к месту перенаправления заголовок авторизации не включается.
По этой причине PowerShell 6.0.0 добавляет параметр PreserveAuthorizationOnRedirect .
Указывает, что командлет должен сохранять заголовок авторизации, если он присутствует, при перенаправлениях.
По умолчанию командлет удаляет заголовок авторизации перед перенаправлением.Указание этого параметра отключает эту логику для случаев, когда заголовок необходимо отправить в место перенаправления.
Ссылка Invoke-WebRequest
Как альтернатива , если вы не используете PowerShell 6, вы можете обойти его с помощью более низкого уровня сценария, используя System.Net.WebRequest
, который определяет свойство AllowAutoRedirect
, которое можно установить на False
чтобы пропустить перенаправление после успешного POST, избегая ошибки 401.
Обратите внимание, что вам нужно позаботиться о таких вещах, как форматирование данных / тела (json, form-urlencoded, ...) иhttp-заголовки сами.
Сценарий будет выглядеть ниже.
Обратите внимание на строку с AllowAutoRedirect = $false
.
$creds = "$($BASIC_AUTH_USER):$($BASIC_AUTH_PASS)"
$encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($creds))
$basicAuthValue = "Basic $encodedCreds"
$url = "http://your.url"
$request = [System.Net.WebRequest]::CreateHttp($url);
$request.Method = "post"
$request.Headers.Add("Authorization", $basicAuthValue)
$request.AllowAutoRedirect = $false
$body = "your formatted data goes here"
$bytes = [System.Text.Encoding]::UTF8.GetBytes($body);
$stream = $request.GetRequestStream()
$stream.Write($bytes, 0, $bytes.Length);
$stream.Close();
$request.GetResponse();