Invoke-RestMethod 返回 401 - 在 Powershell 7 中未经授权

Invoke-RestMethod returning 401 - Unauthorized in Powershell 7

我 运行 遇到了一个问题,试图在 PowerShell 7 中使用 Invoke-RestMethod 命令。我可以在 PowerShell 5.1 中将它设置为 运行,但 7 给了我401 - 未经授权的消息。

这是 PowerShell 5.1 的命令:

Invoke-RestMethod "http://internalServer/api/job?name=testJob" -Method GET -UseDefaultCredentials -ContentType "application/JSON"

这是 PowerShell 7 的命令:

Invoke-RestMethod "http://internalServer/api/job?name=testJob" -Method GET -UseDefaultCredentials -ContentType "application/JSON" -AllowUnencryptedAuthentication

api 托管在使用 Windows 身份验证的内部服务器上。当我通过 Fiddler 跟踪请求时,这两个命令似乎都获得了 401 响应,但 PowerShell 5.1 使用响应生成授权:协商 YII{token} header 而 PowerShell 7 停止并 returns 一个错误.以前有其他人遇到过这个吗?

如评论中所示,此处正在进行重定向。默认情况下,身份验证不会在重定向后继续存在,但您可以使用 -PreserveAuthorizationOnRedirect 参数控制 Invoke-RestMethod:

$irmParams = @{
  Uri = "http://internalServer/api/job?name=testJob"
  Method = 'GET'
  UseDefaultCredentials = $true
  ContentType = 'application/json'
  PreserveAuthorizationOnRedirect = $true # <== Should be your solution
  AllowUnencryptedAuthentication = $true # <=== You should not be using this :)
}

Invoke-RestMethod @irmParams

Thanks to some additional legwork by OP, -PreserveAuthorizationOnRedirect:

Will only keep the authentication headers for requests made to a Uri that includes the original Uri up to the last /. What the documentation doesn't include is that the subsequent Uri's must also match the case of the original Uri.

在 OP 的案例中,重定向改变了原始 Uri 的大小写,因此即使他们指定 -PreserveAuthorizationOnRedirect.

也会破坏重定向的身份验证