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

如何修正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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:16:04