Invoke-Webrequest在POST上获取401,但在具有基本身份验证的GET上未获取401

时间:2018-10-03 23:37:33

标签: powershell web-applications invoke-webrequest

我有一个启用了基本身份验证的开发站点。我将使用以下内容来获取页面,以将基本身份验证添加到标题中:

$creds = "$($BASIC_AUTH_USER):$($BASIC_AUTH_PASS)"
$encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($creds))
$basicAuthValue = "Basic $encodedCreds"
$headers = @{
    Authorization = $basicAuthValue
}

$login = Invoke-WebRequest $url -SessionVariable session -UseBasicParsing -Headers $headers

但是我无法发布到相同的URL:

$fields = @{ Email = $SITE_USER; Password = $SITE_PASS; }
$login = Invoke-WebRequest -Uri $url -Method POST -WebSession $session -Body $fields -UseBasicParsing -Headers $headers

我收到了401未经授权的回信。如果我在网站上禁用基本身份验证,则一切正常。所以我知道这不是服务器问题。我可以使用浏览器进行发布。

编辑:所以当我在服务器上调试时,似乎基本身份验证正常工作。但是我的服务器返回了重定向,然后导致Invoke-Webrequest将其解释为401。

关于为什么这可能不起作用的任何想法?

1 个答案:

答案 0 :(得分:1)

由于重定向,您会收到此行为;向重定向位置发出此附加请求时,不包含授权标头。

因此, PowerShell 6.0.0 添加了 PreserveAuthorizationOnRedirect 参数。

  

指示cmdlet在跨重定向时应保留Authorization标头(如果存在)。
  默认情况下,该cmdlet在重定向之前会剥离Authorization标头。指定此参数会在需要将标头发送到重定向位置的情况下禁用此逻辑。

Invoke-WebRequest reference


作为替代,如果您未使用PowerShell 6,则可以使用定义属性 System.Net.WebRequest的{​​{1}}通过更底层的脚本来解决它可以设置为AllowAutoRedirect,以便在POST成功后跳过重定向,从而避免401错误。

请注意,您必须自己处理数据/正文格式(json,form-urlencoded等)和http标头。

脚本如下所示。
请注意带有False的行。

AllowAutoRedirect = $false