如何强制 PS 查找模块命令在默认为 NTLM 身份验证的 Windows 域中使用基本身份验证(使用 PAT)?



我可以在没有-Credential参数的情况下调用Find-Module,并且工作正常。这是因为:

  1. 有问题的模块位于 Windows 域中的本地 NuGet 存储库中
  2. 默认身份验证为 NTLM

现在我真的很想使用 PAT,这迫使我通过-Credential论点。但是,为了正常工作,必须将身份验证切换到基本。这就是我被困住的地方。

我知道如何使用 PAT 凭据(和ValidAuthenticationTypes=basic)配置 NuGet 源,因此我能够将 nuget.exe 与 PAT 一起使用。但我特别需要Find-Module(和Install-Module)来工作。

这发生在Windows Powershell和PS Core上。以下是 PS 核心Get-Module输出:

C:Usersp11f70f> get-module
ModuleType Version    PreRelease Name                                ExportedCommands
---------- -------    ---------- ----                                ----------------
Manifest   7.0.0.0               Microsoft.PowerShell.Management     {Add-Content, Clear-Content, Clear-Item, Clear-It…
Manifest   7.0.0.0               Microsoft.PowerShell.Security       {ConvertFrom-SecureString, ConvertTo-SecureString…
Manifest   7.0.0.0               Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare-Ob…
Script     1.4.8.1               PackageManagement                   {Find-Package, Find-PackageProvider, Get-Package,…
Script     1.0.0                 Posh-Git                            {Add-PoshGitToProfile, Expand-GitCommand, Format-…
Script     2.2.5                 PowerShellGet                       {Find-Command, Find-DscResource, Find-Module, Fin…
Script     2.1.0                 PSReadLine                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption, …
C:Usersp11f70f>

使用 ILSpy 我跟踪了Find-Module的执行,我的结论是,如果服务器更喜欢 NTLM,则不可能使其与 PAT 一起使用。

这是非常脆弱的,因为一些 PS 流使用内部逻辑与 NuGet 服务器交互(如Find-ModuleInstall-Module),而其他流回退到dotnet.exe nugetnuget.exe(如Publish-Module)

后者识别保存在$env:APPDataNuGetNuGet.config文件中的 PAT 凭据,最重要的是尊重validAuthenticationTypes属性,该属性强制它们使用基本身份验证替代 NTLM。

内部 PS 逻辑不做任何此类操作。此外,它会被保存的 PAT 凭据毒害,该凭据将与 NTLM 一起使用,这是完全错误的。

真是一团糟。

相关内容

最新更新