【问题标题】:VSTS NuGet Publisher - 403 (Forbidden) ErrorVSTS NuGet Publisher - 403(禁止)错误
【发布时间】:2017-05-04 22:42:54
【问题描述】:

我在 Team Services 中创建了一个构建定义,它需要在私有代理(即本地构建服务器)上运行。此代理在域帐户下运行。然后,我在 Team Services 中创建了一个 NuGet 源,我试图将由 NuGet Packager 任务创建的包发布到该源。

我在尝试使用 NuGet 发布者任务 (NuGet v4.0.0.2283) 将包推送到内部提要时遇到身份验证错误(403 Forbidden):

2017-05-04T21:05:06.3076014Z CredentialProvider.TeamBuild: Failed to authenticate to https://mycompany.pkgs.visualstudio.com/_packaging/MyProject/nuget/v3/index.json from your project collection, prefix = https://mycompany.pkgs.visualstudio.com/
2017-05-04T21:05:07.8546075Z System.AggregateException: One or more errors occurred. ---> NuGet.Protocol.Core.Types.FatalProtocolException: Unable to load the service index for source https://mycompany.pkgs.visualstudio.com/_packaging/MyProject/nuget/v3/index.json. ---> System.Net.Http.HttpRequestException: Response status code does not indicate success: 403 (Forbidden).

请注意,我可以使用此处所述的凭据在构建服务器上手动发布相同的包:https://www.visualstudio.com/en-us/docs/package/nuget/nuget-exe

现在,构建定义是项目范围的(不是项目集合范围的)。因此,将 Project Collection Build 服务帐户添加到提要的贡献者的默认权限可能不正确。 我认为需要将与此特定团队项目关联的Project Build服务帐户添加到贡献者(或所有者)中。

由于此 Team Services 帐户中有 15 个以上的项目,并且 Project Build Service 帐户都具有相同的名称,因此要找到正确的帐户需要一些工作。通过将以下 PowerShell 内联脚本添加到构建中(我从这里获得:https://github.com/Microsoft/vsts-tasks/issues/3287),我设法找到了特定的项目构建服务帐户 guid:

$headers = @{Authorization="Bearer ${env:SYSTEM_ACCESSTOKEN}"}
$response = Invoke-RestMethod "${env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI}/_apis/connectionData" -Headers $headers 
$response.authenticatedUser | Format-List id, customDisplayName | Out-Host

现在,我似乎无法通过键入其 guid 或键入“Project Build Service”以从帐户列表中找到具有正确 guid 的帐户来将 Project Build Service 帐户添加到提要的贡献者。

这是一个错误还是我忘记配置一些东西?

【问题讨论】:

  • 如果您将帐户添加为 Feed 权限的所有者,构建结果是什么?
  • 我的(用户)帐户已经是提要的所有者。这可能就是我能够使用 VSTS Credentials Provider 手动发布到提要的原因。代理服务虽然在不同的(服务)帐户下运行。我是否需要在 VSTS 中为此服务帐户创建用户?我在 MSDN 文档中没有看到这样做的要求...

标签: azure-devops azure-pipelines-build-task azure-artifacts


【解决方案1】:

我设法找到了解决方案。为了其他可能遇到相同问题的人的利益,这里是解决问题的方法。

我开始查看 REST API 以获得提要权限,以尝试将项目特定的构建服务帐户(使用从上述 PowerShell 脚本收集的 ID)添加到提要的贡献者。

查看API documentation,我意识到您需要指定具有以下格式的完整身份描述符:

Microsoft.TeamFoundation.ServiceIdentity;00000000-0000-0000-0000-000000000000:Build:10000000-0000-0000-0000-00000000000 

然后我修改了内联 PowerShell 脚本以显示有关项目构建服务身份的所有信息:

$headers = @{Authorization="Bearer ${env:SYSTEM_ACCESSTOKEN}"}
$response = Invoke-RestMethod "${env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI}/_apis/connectionData" -Headers $headers 
$response.authenticatedUser | Format-List | Out-Host

然后我意识到返回的描述符包含第二个 guid,它出现在“Build:”部分之后,它与身份 id 不同。此 guid 也出现在返回的 authenticatedUser 对象的 providerDisplayName 属性中。

使用提要权限界面,我尝试使用 providerDisplayName guid 进行搜索,最后得到了一个结果!将此项目构建服务帐户添加到贡献者并运行新构建后,我能够发布提要。

为了方便配置提要的权限,我相信documentation specific to build identities 可以改进,因为它只提到了项目集合范围的构建定义,而不是项目范围的定义。

最终,问题源于这样一个事实,即如果一个 Team Services 帐户包含多个项目,则为项目的构建服务帐户授予正确的权限并不容易,因为它们都具有相同的名称,即 Project Build Service (帐户)。

【讨论】:

  • 感谢您的信息,我能够解决同样的问题。我发现查看 TFS 服务器上的事件查看器,您还可以获取有关构建代理使用的帐户的信息。例如:ExceptionMessage: Build\308bbda0-dd0a-4358-8e5f-768f58d2c3d5 没有权限完成这个动作。它需要“ReadPackages”。 (类型 FeedNeedsPermissionsException)
猜你喜欢
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多