为何dotnet nuget push报401错误,nuget.exe push却成功?
问题描述
我在Azure Artifacts中创建了用于发布NuGet包的源,并生成了权限范围正确的Personal Access Token(PAT)。
执行以下命令可成功发布:
nuget.exe push -Source "myAzureFeed" -Apikey $(cat apikey) .\bin\Debug/MyPackage1.2.3.nupkg
但执行dotnet nuget push命令时返回401未授权错误:
PS D:\NuGet\create-package\using-dotnet-cli> dotnet nuget push .\bin\Debug\MyPackage.1.2.3.nupkg -s myAzureFeed -k $(cat apikey) Pushing MyPackage.1.2.3.nupkg to 'https://pkgs.dev.azure.com/123/abc/_packaging/xyz/v2/'... PUT https://pkgs.dev.azure.com/123/abc/_packaging/xyz/nuget/v2/ Unauthorized https://pkgs.dev.azure.com/123/abc/_packaging/xyz/nuget/v2/'... PUT https://pkgs.dev.azure.com/123/abc/_packaging/xyz/nuget/v2/ 1323ms error: Response status code does not indicate success: 401 (Unauthorized).
请问为何nuget.exe push成功,而dotnet nuget push失败?
原因及解决办法
以下是几个常见的原因和对应的修复方案:
1. PAT包含多余的换行符
PowerShell中$(cat apikey)会读取文件的全部内容,包括文件末尾的换行符。nuget.exe会自动去除API key的首尾空白字符,但dotnet nuget push不会,导致传递的PAT带有换行符,引发认证失败。
解决办法:
使用Get-Content的-Raw参数读取文件,并去除首尾空白:
dotnet nuget push .\bin\Debug\MyPackage.1.2.3.nupkg -s myAzureFeed -k $((Get-Content apikey -Raw).Trim())
2. dotnet CLI与nuget.exe使用的NuGet配置不一致
nuget.exe和dotnet CLI可能读取不同的NuGet.Config文件,或者对源的配置解析存在差异。比如myAzureFeed源在nuget.exe的配置中已正确设置认证,但dotnet CLI未读取到对应配置。
解决办法:
- 检查并统一全局和项目目录下的
NuGet.Config文件,确保myAzureFeed源的配置正确:<configuration> <packageSources> <add key="myAzureFeed" value="https://pkgs.dev.azure.com/123/abc/_packaging/xyz/nuget/v3/index.json" /> </packageSources> <packageSourceCredentials> <myAzureFeed> <add key="Username" value="any" /> <add key="ClearTextPassword" value="你的PAT" /> </myAzureFeed> </packageSourceCredentials> </configuration> - 或者直接在
dotnet nuget push命令中使用源的完整URL替代源名称,避免配置解析问题:dotnet nuget push .\bin\Debug\MyPackage.1.2.3.nupkg -s "https://pkgs.dev.azure.com/123/abc/_packaging/xyz/nuget/v3/index.json" -k $((Get-Content apikey -Raw).Trim())
3. dotnet CLI自带的NuGet版本过旧
较旧版本的dotnet CLI集成的NuGet可能对Azure Artifacts的认证流程支持不完善,导致401错误,而你使用的nuget.exe是较新版本,能正常处理认证。
解决办法:
- 更新dotnet CLI到最新稳定版本;
- 或者通过
dotnet nuget update source命令手动更新源的配置,确保兼容Azure Artifacts的认证方式。
4. PowerShell参数解析差异
dotnet nuget push的参数解析逻辑与nuget.exe略有不同,比如源名称的大小写敏感、参数顺序的隐性影响等。
解决办法:
- 确保命令中使用的源名称
myAzureFeed与NuGet.Config中配置的完全一致(包括大小写); - 调整命令参数顺序,将源参数放在包路径之前,与
nuget.exe的命令格式对齐:dotnet nuget push -s "myAzureFeed" -k $((Get-Content apikey -Raw).Trim()) .\bin\Debug\MyPackage.1.2.3.nupkg
内容的提问来源于stack exchange,提问作者YoavKlein
相关产品推荐
相关产品推荐

