You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 06:30:51