我有一个启用了基本身份验证的开发站点。我将使用以下内容来获取页面,以将基本身份验证添加到标题中:
$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。
关于为什么这可能不起作用的任何想法?
答案 0 :(得分:1)
由于重定向,您会收到此行为;向重定向位置发出此附加请求时,不包含授权标头。
因此, PowerShell 6.0.0 添加了 PreserveAuthorizationOnRedirect 参数。
指示cmdlet在跨重定向时应保留Authorization标头(如果存在)。
默认情况下,该cmdlet在重定向之前会剥离Authorization标头。指定此参数会在需要将标头发送到重定向位置的情况下禁用此逻辑。
作为替代,如果您未使用PowerShell 6,则可以使用定义属性 System.Net.WebRequest
的{{1}}通过更底层的脚本来解决它可以设置为AllowAutoRedirect
,以便在POST成功后跳过重定向,从而避免401错误。
请注意,您必须自己处理数据/正文格式(json,form-urlencoded等)和http标头。
脚本如下所示。
请注意带有False
的行。
AllowAutoRedirect = $false