TFS NuGet Publisher任务报401错误:安全包无可用凭据
问题背景
我的Build Pipeline包含以下任务:
- Build and Package - .NET Core:执行命令
pack,项目路径src/Camelot.Domain.csproj,参数为--configuration Release --output $(build.artifactstagingdirectory)/package /p:Version=$(Build.BuildNumber) - 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;不生成该文件则任务正常。
疑问
- 明明
NuGet.config已提供凭据,为何提示安全包无可用凭据? - 如何在本地复现该流程?获取accessToken是否只需创建Personal Access Token (PAT)?
- 若改用命令行发布,如何获取对应版本
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获取
- 本地复现步骤:
- 克隆代码到本地,确保本地安装对应版本的.NET Core和NuGet 3.5.0。
- 手动修改
*.csproj文件,把ProjectReferences替换成对应内部源的PackageReferences。 - 在代码根目录生成
NuGet.config,添加内部源、代理,并用你的PAT作为凭据。 - 执行
dotnet pack命令,参数和管道中一致,生成nupkg包。 - 使用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
相关产品推荐
相关产品推荐

