我可以在没有-Credential
参数的情况下调用Find-Module
,并且工作正常。这是因为:
- 有问题的模块位于 Windows 域中的本地 NuGet 存储库中
- 默认身份验证为 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-Module
和Install-Module
),而其他流回退到dotnet.exe nuget
或nuget.exe
(如Publish-Module
)
后者识别保存在$env:APPDataNuGetNuGet.config
文件中的 PAT 凭据,最重要的是尊重validAuthenticationTypes
属性,该属性强制它们使用基本身份验证替代 NTLM。
内部 PS 逻辑不做任何此类操作。此外,它会被保存的 PAT 凭据毒害,该凭据将与 NTLM 一起使用,这是完全错误的。
真是一团糟。