Powershell 使用基本身份验证在POST上调用Webrequest gets 401,而不是在GET上调用Webrequest gets 401

Powershell 使用基本身份验证在POST上调用Webrequest gets 401,而不是在GET上调用Webrequest gets 401,powershell,web-applications,invoke-webrequest,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 =

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

$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
我得到了一份未经授权的回执。如果我在网站上禁用基本身份验证,一切正常。所以我知道这不是服务器问题。我可以使用我的浏览器发布

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


你知道为什么这可能不起作用吗?

你会因为重定向而出现这种行为;向重定向位置发出此附加请求时,不会包含授权标头

因此,PowerShell 6.0.0添加了保留授权onRedirect参数

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


作为一个备选方案,如果您不在PowerShell 6上,您可以使用
System.Net.WebRequest
通过较低级别的脚本解决此问题,该脚本定义了一个属性
AllowAutoRedirect
,该属性可以设置为
False
,以便在成功发布后跳过重定向,避免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();

401是否未经授权?这意味着您没有发布权限?我可以通过浏览器发布到该网站。如果我在站点上禁用基本身份验证,则脚本可以工作。所以是的,我相信我有发帖的许可。