3

我注意到一些奇怪的事情......在 Powershell 中,如果我尝试以下操作:

$uri = new-object System.Uri("http://builds.strongbadia.egg:8080/builds/package.tar.bz2")
$clnt = new-object System.Net.WebClient
$clnt.Credentials = new-object System.Net.NetworkCredential($username, $password)
$clnt.DownloadFile($uri, "package.tar.bz2")

未发送“授权”标头(通过 Wireshark 确认)。即使我使用凭证缓存并且特别声明应该使用基本身份验证:

$cred = new-object System.Net.NetworkCredential($username, $password)
$credcache = new-object System.Net.CredentialCache
$credcache.Add($uri, "Basic", $cred)
$clnt.Credentials = $credcache

它根本不发送标头。相反,我必须执行以下操作:

$auth = 'Basic ' + [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($username+":"+$password ))
$clnt.Headers.Add('Authorization', $auth)

只有这样,“授权”标头才会被发送,这基本上是因为我正在把东西塞进 PowerShell 的喉咙里。

知道这是一个已知的缺陷还是我做错了什么?我似乎无法找到它的参考。

4

1 回答 1

3

我之前实际上已经看到了这一点,基本上 .Net 库在发送凭据之前等待来自服务器的身份验证挑战。问题是某些服务器永远不会发送请求,这就是为什么您看不到您的标头被添加的原因。您的方式有效的原​​因是您明确地将标头强制到标头集合上。

此外,它不只是 PowerShell,它发生在任何 .Net 语言中。

于 2012-11-22T07:54:54.753 回答