奇怪的是我注意到......在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确认)。即使我使用凭证缓存并且具体说明应该使用Basic auth:
$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的喉咙里撞击了一些东西。
不知道这是一个已知的缺陷还是我做错了什么?我似乎无法找到它的参考。
答案 0 :(得分:3)
我之前已经看过这个,基本上.Net库在发送凭据之前等待来自服务器的认证问题。问题是某些服务器永远不会发送请求,这就是为什么你没有看到你的标题被添加。你的方式有效的原因是你明确强迫标题进入标题集合。
此外,它不仅仅是PowerShell,而是以任何.Net语言发生的。