GitHub Action中dotnet restore/build访问组织包出现401未授权错误
我们GitHub组织已推送若干包,可通过组织Packages页面访问,这些包并非仅关联单个仓库。我在某仓库中尝试为其他微服务仓库创建契约包,但该仓库依赖组织内的一个现有包。
当前构建契约包的GitHub Actions工作流如下:
name: Publish [REDACTED].Domain.Shared package on: push: branches: - release/shared/* paths: - "src/[REDACTED]/[REDACTED].Domain.Shared/**" jobs: Publish-Package: runs-on: ubuntu-latest permissions: packages: write contents: read steps: - uses: actions/checkout@v3 - uses: actions/setup-dotnet@v3 with: dotnet-version: "8.x" source-url: https://nuget.pkg.github.com/[REDACTED]/index.json env: NUGET_AUTH_TOKEN: ${{secrets.ACTION_TOKEN}} - run: dotnet restore src/[REDACTED]/[REDACTED].Domain.Shared - run: dotnet build src/[REDACTED]/[REDACTED].Domain.Shared --no-restore - run: dotnet pack --configuration Release src/[REDACTED]/[REDACTED].Domain.Shared - run: dotnet nuget push src/[REDACTED]/[REDACTED].Domain.Shared/bin/Release/*.nupkg
执行到dotnet restore步骤时,出现401未授权错误:
/usr/share/dotnet/sdk/8.0.100/NuGet.targets(156,5): warning : Your request could not be authenticated by the GitHub Packages service. Please ensure your access token is valid and has the appropriate scopes configured. [/home/runner/work/[REDACTED].Domain.Shared/[REDACTED].Domain.Shared.csproj]
Retrying 'FindPackagesByIdAsync' for source 'https://nuget.pkg.github.com/[REDACTED]/download/[REDACTED]/index.json'.
Response status code does not indicate success: 401 (Unauthorized).
我的GitHub令牌已配置repo:all、read:packages和write:packages权限。
包含该契约库的解决方案的NuGet.Config内容如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <clear /> <add key="nuget.org" value="https://api.nuget.org/v3/index.json" /> <add key="[REDACTED]" value="https://nuget.pkg.github.com/[REDACTED]/index.json" /> </packageSources> <packageSourceMapping> <packageSource key="nuget.org"> <package pattern="*" /> </packageSource> <packageSource key="[REDACTED]"> <package pattern="[REDACTED].*" /> </packageSource> </packageSourceMapping> </configuration>
所有仓库使用相同的令牌和NuGet.Config,均能正常生成包,但需要下载组织内其他包作为依赖时就会触发该错误。我已尝试将令牌权限设为全量可用,也尝试移除actions/setup-dotnet@v3中的dotnet认证,但问题依旧。
针对这个401未授权问题,可尝试以下排查和修复步骤:
确认令牌的组织级权限
确保你的GitHub令牌不仅拥有仓库级权限,还具备组织级的read:packages权限。部分场景下,仓库级权限无法覆盖跨仓库的包拉取需求,需在组织设置中给令牌对应的账号(或机器人账号)分配读取组织包的权限。为所有包源显式配置认证
当前actions/setup-dotnet仅配置了组织包源的认证,但dotnet restore可能需要同时处理多个包源。可在actions/setup-dotnet步骤后添加以下命令,手动配置组织包源的凭据:dotnet nuget add source https://nuget.pkg.github.com/[REDACTED]/index.json --name [REDACTED] --username [你的GitHub用户名] --password ${{secrets.ACTION_TOKEN}} --store-password-in-clear-text注:
--store-password-in-clear-text在GitHub Actions环境中是安全的,runner环境会在任务结束后销毁。检查包源映射规则
确认NuGet.Config中的包源映射[REDACTED].*是否完全匹配要拉取的依赖包名称。若依赖包名前缀不符,需调整匹配模式。尝试使用GitHub Actions内置GITHUB_TOKEN
若使用自定义令牌,可替换为GitHub Actions自动生成的GITHUB_TOKEN,它默认拥有当前仓库的read:packages和write:packages权限,无需额外配置。修改工作流中的NUGET_AUTH_TOKEN为${{secrets.GITHUB_TOKEN}},同时确保job的permissions包含packages: read和packages: write。restore时显式指定NuGet.Config路径
有时dotnet restore会使用默认配置而非项目中的NuGet.Config,可显式指定路径:dotnet restore src/[REDACTED]/[REDACTED].Domain.Shared --configfile ./NuGet.Config
内容的提问来源于stack exchange,提问作者ervin

