如何修正GitHub Action中推送NuGet仓库的令牌权限问题
GitHub共享工作流推送NuGet包到组织仓库403错误解决指南
问题详情
我在组织内的独立仓库中维护了一个共享工作流,其中配置了NuGet包的发布推送步骤:
- name: 发布并推送NuGet包 run: | dotnet pack ${{ inputs.csproj_path }} --configuration release -p:Version=${{ needs.gitversion.outputs.NuGetVersionV2 }} -p:WarningLevel=0 dotnet nuget push ${{ inputs.release_folder_path }}*.nupkg -k ${{ secrets.GITHUB_TOKEN }} -s https://nuget.pkg.github.com/OrgName/index.json
但每次执行该共享工作流时,都会返回403权限禁止错误:
Pushing Package.That.Does.Something.v2.nupkg to 'https://nuget.pkg.github.com/OrgName'... PUT https://nuget.pkg.github.com/OrgName/ warn : Your request could not be authenticated by the GitHub Packages service. Please ensure your access token is valid and has the appropriate scopes configured. Forbidden https://nuget.pkg.github.com/OrgName/ 320ms error: Response status code does not indicate success: 403 (Forbidden).
我已经尝试过以下方案,但均未解决问题:
- 使用默认
secrets.GITHUB_TOKEN或自定义私有令牌 - 在调用工作流中设置
permissions: write-all,或在共享工作流的作业/全局层面配置单独权限,甚至不设置显式权限 - 将该工作流代码直接复制到调用仓库中执行时,推送操作完全正常
调用共享工作流的代码如下:
permissions: write-all on: pull_request: push: branches: - main jobs: build_publish: name: 构建并发布 uses: OrgName/actions/.github/workflows/build-package-and-push-to-github-v1.yml@task/allow-tests with: csproj_path: './src/Package.That.Does.Something.csproj' release_folder_path: './src/bin/release/' dotnet_version: '3.1.x'
解决建议
1. 在共享工作流内部显式声明权限
共享工作流不会继承调用方的权限配置,哪怕调用方设置了write-all,共享工作流运行时的GITHUB_TOKEN依然是默认的受限权限。必须在共享工作流的作业层级明确声明所需权限:
jobs: build-publish: permissions: packages: write # 推送NuGet包仅需此权限,无需过度授权 contents: read # 若工作流需要拉取代码,需添加该权限 steps: # 你的打包、推送步骤
2. 配置组织NuGet包的访问权限
确保组织的GitHub Packages允许共享工作流所在仓库的服务账号拥有推送权限:
- 进入组织的Packages页面,找到目标NuGet包
- 点击「Package settings」,在「Manage access」中添加共享工作流所在仓库的名称,将权限设置为「Write」
3. 验证自定义令牌的权限范围(若使用)
如果使用个人访问令牌(PAT)替代默认GITHUB_TOKEN,需确保令牌具备以下权限:
write:packages:允许推送NuGet包到组织仓库repo:若需要访问私有仓库的代码资源
4. 确认NuGet源地址的准确性
检查推送命令中的源地址是否正确,必须包含末尾的index.json:
dotnet nuget push ... -s https://nuget.pkg.github.com/OrgName/index.json
缺少index.json会导致认证请求被拒绝。
5. 检查共享工作流分支的权限
若共享工作流所在仓库设置了分支保护规则,需确保你引用的task/allow-tests分支允许工作流运行,且服务账号有权限执行该分支的工作流。
内容的提问来源于stack exchange,提问作者Daniel Mulroy
相关产品推荐
相关产品推荐

