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

TFS NuGet Publisher任务报401错误:安全包无可用凭据

问题背景

我的Build Pipeline包含以下任务:

  1. Build and Package - .NET Core:执行命令pack,项目路径src/Camelot.Domain.csproj,参数为--configuration Release --output $(build.artifactstagingdirectory)/package /p:Version=$(Build.BuildNumber)
  2. Publish Packages - NuGet Publisher:路径匹配$(build.artifactstagingdirectory)/package/*.nupkg,源类型为Internal Nuget Feed,内部源地址https://tfs.XXX.com/tfs/XXX/_packaging/KAT.Nuget.Feed/nuget/v3/index.json,NuGet版本3.5.0

另外有自定义命令行工具在$(Build.SourceDirectory)执行两项操作:

  • 修改所有*.csproj文件,将ProjectReferences转为内部TFS源的PackageReferences
  • 在$(Build.SourceDirectory)根目录生成NuGet.config,添加内部源、代理及凭据(使用SYSTEM_ACCESSTOKEN)

排查发现:只要生成NuGet.config,NuGet Publisher就会报错401:No credentials are available in the security package;不生成该文件则任务正常。

疑问
  1. 明明NuGet.config已提供凭据,为何提示安全包无可用凭据?
  2. 如何在本地复现该流程?获取accessToken是否只需创建Personal Access Token (PAT)?
  3. 若改用命令行发布,如何获取对应版本nuget.exe的路径?
解答

1. 凭据无效的原因

  • NuGet版本兼容性问题:你使用的NuGet 3.5.0版本较老,对SYSTEM_ACCESSTOKEN的处理逻辑和新版不同。自定义生成的NuGet.config里的凭据格式可能不被3.5.0识别,比如新版支持的ClearTextPassword或AccessToken字段,老版本无法解析。
  • 配置优先级冲突:Azure DevOps的NuGet Publisher任务默认会自动注入服务连接的凭据到临时配置文件,而你自定义生成的NuGet.config覆盖了这个默认配置,导致任务无法找到正确的凭据。另外,SYSTEM_ACCESSTOKEN在管道中是环境变量,直接写进NuGet.config可能没有正确被解析,或者权限范围不匹配。
  • 凭据存储方式问题:老版本NuGet可能不支持在配置文件中直接明文存储令牌,需要用nuget sources add命令添加带凭据的源,而不是手动生成配置文件。

2. 本地复现流程及Token获取

  • 本地复现步骤:
    1. 克隆代码到本地,确保本地安装对应版本的.NET Core和NuGet 3.5.0。
    2. 手动修改*.csproj文件,把ProjectReferences替换成对应内部源的PackageReferences。
    3. 在代码根目录生成NuGet.config,添加内部源、代理,并用你的PAT作为凭据。
    4. 执行dotnet pack命令,参数和管道中一致,生成nupkg包。
    5. 使用NuGet 3.5.0执行nuget push命令,尝试推送到内部TFS源,验证是否出现相同的401错误。
  • Token获取:是的,本地复现只需创建Personal Access Token (PAT),需确保PAT拥有**Packaging (Publish)**权限,以及对应的项目范围权限。

3. 命令行发布获取nuget.exe路径

  • 在Azure DevOps管道中:
    如果用NuGetToolInstaller任务指定版本3.5.0,工具会自动下载并将路径加入环境变量,你可以直接用nuget命令执行,或者通过环境变量$(NuGetToolPath)获取nuget.exe的所在目录,完整路径为$(NuGetToolPath)/nuget.exe。
  • 本地环境:
    手动下载NuGet 3.5.0的exe文件,放在固定目录或加入系统环境变量PATH,直接用nuget命令调用;也可以通过where nuget命令查找路径(已加入PATH的前提下)。

内容的提问来源于stack exchange,提问作者Terry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 00:22:43