用于从发布到管道进行无代理 API 调用的 Azure AD 服务主体

问题描述 投票:0回答:2

我目前有一个无代理发布管道,它可以对 https://dev.azure.com/myorg/ 上的 AzureDevops 管道进行 API 调用。目前,为了进行身份验证,我使用带有电子邮件地址和 PAT 令牌的通用服务连接

为了消除 PAT 令牌,我尝试使用服务主体 ID 和密钥。我尝试将

connection type
设置为
Azure resource manager
,选择适当的服务主体,但我无法使其正常工作。

Microsoft 目前支持这种身份验证方法吗?任何人都可以向我指出一些有关如何实现身份验证的信息吗?我不断收到的错误是

azure devops {"error":{"code":"MissingSubscription","message":"The request did not have a subscription or a valid tenant level resource provider."}} Exception Message:

azure-devops federated-identity azure-releases
2个回答
1
投票

使用 Invoke REST API 任务 调用 Azure DevOps REST API 时,建议使用“

system.AccessToken
”(作业访问令牌)作为授权,而不是使用用户 PAT 或服务主体访问令牌。

因为‘

system.AccessToken
’结合了安全性和便利性:

  1. system.AccessToken
    ”由 Azure Pipelines 在运行时为每个作业动态生成。它在管道作业启动时生成,并在作业结束时撤销。

  2. 您可以通过控制以下身份的权限来控制‘

    system.AccessToken
    ’的权限。

    • Project Collection Build Service ({Organization Name})
    • {Project Name} Build Service ({Organization Name})

有关更多详细信息,您可以查看“作业访问令牌”。


要使用 Invoke REST API 任务上的“

system.AccessToken
”来调用 Azure DevOps REST API,您可以执行以下操作:

  1. 假设我需要调用API“Runs - Get”来检查指定管道运行的状态是否成功完成。

  2. 转到“项目设置”>“服务连接”,创建一个通用服务连接,如下所示。您只需设置服务器URL服务连接名称

    MyOrg
    是 Azure DevOps 组织的名称,
    MyProj
    是项目名称。

  3. 在 Invoke REST API 任务上,设置如下。


如果您想使用ServicePrincipal作为授权,您需要执行如下操作:

  1. AAD 的先决条件。

    • 如果您没有 AAD (Microsoft Entra ID),请创建一个服务主体。
    • 为服务主体创建客户端密钥。
  2. Azure DevOps 的先决条件。

    • 转到 组织设置 > Azure Active Directory,确保组织已连接到创建服务主体的 AAD。
    • 转到 组织设置 > 用户,搜索服务主体并将其添加到组织中。
    • 将服务主体添加到安全组中,以便您可以通过组织中的该组管理其权限。
  3. 为服务主体生成访问令牌。您可以运行下面的 Bash 脚本来生成令牌。

    access_token=$(curl -X POST -H "Content-Type: application/x-www-form-urlencoded" 'https://login.microsoftonline.com/{tenant_ID}/oauth2/v2.0/token' \
    -d 'grant_type=client_credentials&client_id={client_id}&client_secret={client_secret}&scope=499b84ac-1321-427f-aa17-267ca6975798/.default' | jq -r '.access_token')
    echo $access_token
    
    • {tenant_ID}
      是 AAD 的目录(租户)ID
    • {client_id}
      是服务主体的应用程序(客户端)ID
    • {client_secret}
      是服务主体的客户端密钥的值。
  4. access_token
    的值设置为管道中的秘密变量(即,将其命名为
    sp_access_token
    )。然后在调用 REST API 任务中,使用
    Headers
    的密钥,如下所示。

    {
    "Authorization": "Bearer $(sp_access_token)"
    }
    

注意:

服务主体的访问令牌只有 24 小时的生命周期,因为 AAD 将定期轮换令牌。因此,您需要至少每 24 小时刷新一次令牌。这可能会在管道作业中使用令牌时造成不便。

因此,如上所述,建议使用 '

system.AccessToken
'。



0
投票

谢谢你。这没有任何问题。尽管此信息在这里得到了很好的解释,但我很难在 Microsoft 文档中找到它

© www.soinside.com 2019 - 2024. All rights reserved.