Microsoft Entra ID 应用程序身份验证和 Azure DevOps REST API

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

我正在开发一项多租户服务,该服务将代表用户在 Azure DevOps 中列出、创建和更新工作项。我对 Entra ID 应用程序的设置、其身份验证流程和 Azure DevOps REST API 有点困惑。

我一直在谷歌上搜索,到目前为止我遇到的大多是使用Azure DevOps OAuth 2.0或使用PAT,我不想使用PAT,微软建议改用Entra ID OAuth,或者不是多租户解决方案接受个人账户。

我的 Entra ID 应用程序配置缺少什么,或者我是否误解了 OAuth 流程的工作原理。任何指向文档或代码示例的指针将不胜感激。

这是我尝试过的:

Entra ID (Azure AD) 应用程序

自此文档推荐新开发人员使用 Microsoft Entra ID OAuth 而不是 Azure DevOps OAuth 2.0。

  • 创建了 Entra ID 应用程序,并将 身份验证 设置为 任何组织目录中的帐户(任何 Microsoft Entra ID 租户 - 多租户)和个人 Microsoft 帐户(例如 Skype、Xbox)
  • 对于 API 权限,我有
    offline_access
    openid
    (来自 Microsoft Graph)和
    vso.work_full
    (来自 Azure DevOps)。
  • Web 重定向 URI 目前设置为 https://jwt.ms

认证流程

  • 重定向至
    https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=<clientId>&response_type=code&redirect_uri=https://jwt.ms&response_mode=query&scope=openid offline_access&prompt=select_account

使用我的 Microsoft 帐户登录后,我得到

error=invalid_scope&error_description=The provided value for the input parameter 'scope' is not valid. The scope 'openid offline_access vso.work_full' does not exist.

如果我使用范围

openid offline_access
那么我可以获得代码,但是在使用
https://login.microsoftonline.com/common/oauth2/v2.0/token
将代码发布到
vso.work_full
时,我收到相同的错误,说范围不存在。我没有尝试在没有
openid
offline_access
的情况下授权,因为我想支持个人帐户,删除这些将不允许我以个人帐户登录。

azure-active-directory azure-ad-graph-api azure-devops-rest-api microsoft-entra-id
1个回答
0
投票

要使用 Microsoft Entra ID 应用程序访问 Azure DevOps,您可以通过以下步骤进行配置: Azure 门户的先决条件:

  1. 转至 Microsoft Entra ID > 应用程序注册,在 AAD (Microsoft Entra ID) 中创建一个新应用程序(如果您没有)。
  2. 打开应用程序,如果没有现有的有效客户端密钥,请转至 证书和密钥 > 客户端密钥选项卡为应用程序创建客户端密钥。复制并记住客户端密钥的值。

Azure DevOps 的先决条件:

  1. 转到 组织设置 > Azure Active Directory,确保组织已连接到创建应用程序的 AAD。
  2. 转到 组织设置 > 用户,搜索应用程序并将其添加到组织中。
  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}
    替换为应用程序的 Application(客户端)ID
  • {client_secret}
    替换为应用程序中创建的客户端密钥的值。
  • 范围“
    499b84ac-1321-427f-aa17-267ca6975798/.default
    ”特定于 Azure DevOps,未更改。它与 Azure DevOps 中的PAT范围不同。

注:

通过这种方式生成的访问令牌的生命周期只有 24 小时,因为 AAD 会定期轮换令牌。因此,如果您想继续使用令牌,可能需要至少每 24 小时刷新一次。


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