1

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

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

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

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

4

2 回答 2

2

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

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

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

调用 WebRequest 参考


作为替代方案,如果您不在 PowerShell 6 上,则可以通过更底层的脚本来解决它,该脚本使用System.Net.WebRequestwich 定义了一个AllowAutoRedirect可以设置为的属性,False以便在成功 POST 后跳过重定向,避免 401 错误。

请注意,您必须自己处理数据/正文格式(json、form-urlencoded、...)和 http-headers 之类的事情。

该脚本将如下所示。
注意带有 的行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();
于 2018-10-05T08:54:29.237 回答
0

正如 pfx 所说,它很可能与重定向有关,您也可以执行 0 的 MaximumRedirection 并捕获错误。这样您就可以获得重定向的 url 并重试。

于 2021-10-14T12:45:06.027 回答