首页 文章

VSTS NuGet Publisher - 403(Forbidden)错误

提问于
浏览
0

我在Team Services中创建了一个构建定义,它需要在私有代理(即内部构建服务器)上运行 . 此代理程序在域帐户下运行 . 然后我在Team Services中创建了一个NuGet提要,我试图发布由NuGet Packager任务创建的包 .

当我尝试使用NuGet Publisher任务(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作用域) . 因此,将 Project Collection Build 服务帐户添加到订阅源的默认权限可能不正确 . 我相信与此特定团队项目相关联的 Project Build 服务帐户需要添加到贡献者(或所有者) .

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

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

1 回答

  • 3

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

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

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

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

    然后,我修改了内联PowerShell脚本以显示有关Project Build Service标识的所有信息:

    $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 属性中 .

    使用feed权限界面,我尝试使用providerDisplayName guid进行搜索,最后得到一个结果!将此Project Build服务帐户添加到贡献者并运行新构建后,我能够发布该源 .

    为了便于配置feed的权限,我相信documentation specific to build identities可以改进,因为它只提到项目集合作用域构建定义而不是项目作用域定义 .

    最终,问题源于这样一个事实,即如果一个Team Services帐户计算多个项目,那么为项目的构建服务帐户提供正确的权限并不容易,因为它们都具有相同的名称,即项目构建服务(帐户) .

相关问题