首页 > 解决方案 > 服务帐户能否将更改推送到 Azure Repos?

问题描述

对于内容存储在 JSON 文件中的 CMS 系统,我们希望使用 repo 来跟踪和批准更改。当编辑器进行更改时,我们希望服务器能够提交更改并将更改推送到存储库,然后创建拉取请求。我们希望能够使用服务帐户而不是编辑帐户来执行此操作。

我以为我可以创建一个 Azure AAD 应用程序注册,这样我就可以创建一个 oauth2 不记名令牌以用于我的 api 请求,但我不知道如何授予该帐户对存储库的访问权限。该门户有一个 API 权限项,我可以在其中授予我的应用程序对 Azure DevOps 的权限,但它只是用户模拟/委托权限,为应用程序本身提供权限的选项被禁用。

有可能做我们想做的事吗?

更新:我尝试过的事情

1) 我创建了一个 AAD 应用程序并为该应用程序创建了一个秘密,这样我就可以使用 appId 和秘密来获取一个不记名令牌。然后我尝试为我的应用程序添加 API 权限到 DevOps,但它只允许我创建委派权限,因为应用程序权限被禁用。我觉得如果我能给这个应用程序必要的权限,我就会解决问题。

2) 我试图在 DevOps 和 Repos 中找到一种方法来允许我的 AAD 应用程序访问,但该应用程序没有出现在我看过的任何地方。我看到的只是用户和组,我的应用程序没有出现在这两个列表中。

3) 我在https://app.vsaex.visualstudio.com/app/register注册了一个应用程序,并拥有一个 appId 和密码。我对此持怀疑态度,因为它需要一个回调 url,而我正在尝试使用 client_credentials。当我尝试使用此 appId 和 secret 获取令牌并调用https://app.vssps.visualstudio.com/oauth2/token时,服务返回 400 错误。我请求不记名令牌的 POST 包括有效负载 client_id={the clientId}&client_secret={the secret}&grant_type=client_credentials 和 application/x-www-form-urlencoded 的内容类型。当我将 url 设置为https://login.microsoftonline.com并使用 AAD appId 和机密时,相同的代码会成功,但由于上述原因,该身份无法访问 DevOps。

4) 我已经查看了https://github.com/microsoft/azure-devops-auth-samples上的示例,但其中大多数是交互式的,不符合要求。

标签: azureauthenticationazure-devopsazure-repos

解决方案


如果您不想使用编辑的帐户。您可以只创建一个个人访问令牌,然后选择此令牌的完整代码范围。然后您可以使用此 Person 访问令牌向 azure devops 服务器发出 api 请求。您可以在此处查看创建人员访问令牌的详细步骤。

在此处输入图像描述

下面是一个调用 azure devops api 的 powershell 脚本示例。是在 C# 中使用 HttpClient 类。

$url = "https://dev.azure.com/{org}/{proj}/_apis/...."

$connectionToken="Personal Access Token"

$base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))

$result = Invoke-RestMethod -Uri $url -Headers @{authorization = ("Basic {0}" -f $base64AuthInfo)} -Method get

您也可以尝试创建一个虚拟用户将其添加到您的组织中,因此您可以使用此虚拟用户帐户执行上述操作。

如果您想使用 OAuth 2.0 授权对 REST API 的访问。您必须按照授权流程使用回调 url 来获取授权码。

client_credentials 授权流程适用于 azure,不适用于 azure devops。


推荐阅读