在 Azure Pipelines 中使用托管标识:GetUserAccessToken:无法获取标识的访问令牌。 AAD 返回静默失败

Posted

技术标签:

【中文标题】在 Azure Pipelines 中使用托管标识:GetUserAccessToken:无法获取标识的访问令牌。 AAD 返回静默失败【英文标题】:Using Managed Identity in Azure Pipelines: GetUserAccessToken: Failed to obtain an access token of identity. AAD returned silent failure 【发布时间】:2020-07-14 23:48:27 【问题描述】:

我正在尝试在 Azure Pipelines 中运行 Azure Resource Group Deployment task。我部署了一个Azure Pipelines self-hosted agent on an Azure VM running Windows,并在我的 Azure DevOps 组织中设置了一个Azure Resource Manager service connection to a VM with a managed service identity。

但是,当我尝试使用具有托管标识的服务连接来配置我的 Azure 资源组部署任务时出现以下错误:

GetUserAccessToken: 获取 identity 的访问令牌失败。 AAD 返回静默失败。

截图:

我已验证我已授予对目标资源组的 VM 托管标识的访问权限(参与者):

服务连接也适用于 Azure 订阅:

感谢您提供有关诊断此问题的任何帮助。谢谢!

【问题讨论】:

【参考方案1】:

我遇到此错误的场景是将服务连接添加到 Azure DevOps 中的管理组

GetUserAccessToken:获取身份的访问令牌失败 GUID。 AAD 返回静默失败。

对我的修复是在 DevOps 中将我的帐户添加为项目集合管理员...详细信息如下:

尝试了所有可能的权限...GA、ROOT Mgmt 组所有者(通过 AAD 设置)、目标 Mgmt 组所有者、订阅所有者、应用程序管理员...在 devops 中,我是项目管理员,我在服务中具有管理员安全角色连接。

我有一个有趣的差异,我的 Azure AD 主租户与我的 Azure 订阅 AD 租户不同(我是 B2B 来宾)。

我实际上尝试使用一个不同的 DevOps 租户,该租户的 AAD 与 Azure 订阅租户相关联,并且它工作正常 :( 这使我进一步深入了解不同之处。除了 DevOps->AAD 链接,我也是COLLECTION 管理员在工作的一个,只有一个项目管理员在失败的那个。我确保我拥有管理组所有者权限,然后将我的帐户添加为项目集合管理员 - 工作!

参考:https://developercommunity.visualstudio.com/solutions/1246044/view.html

【讨论】:

【参考方案2】:

如果这对其他人有用,我在通过 Azure DevOps 修改服务连接时遇到了类似的问题。 Charlie Brown 提供的解决方案为我指明了正确的方向:AAD 中的用户不会自动添加到 Azure DevOps 企业应用程序中,因此如果遇到此问题,可能意味着您需要添加尝试添加的用户或组通过 DevOps 访问它。

就我而言,我只是通过 Azure 门户 -> Azure Active Directory -> 企业应用程序 -> Azure DevOps 将自己添加为所有者和用户。

我不必创建另一个用户,也不必使用 MFA 修改任何内容。

【讨论】:

【参考方案3】:

问题的出现似乎是因为 已通过 Azure DevOps 身份验证的用户帐户 正在检索订阅信息。 Azure DevOps 不使用托管标识来检索订阅信息。

特别是,我的原始 Azure DevOps 用户帐户已打开 MFA 以对 Azure 订阅(例如,portal.azure.com)进行身份验证,但没有打开 MFA 以对 Azure DevOps 进行身份验证(例如 dev.azure.com/)。我认为这是在未能获得访问令牌时导致问题的原因:

我在我的 Azure AD 中创建了一个不同的用户帐户,授予它访问我的 Azure DevOps 组织的权限,并确保这个新用户帐户对目标订阅具有阅读者权限并且没有打开 MFA强>。这解决了使用托管标识时获取订阅信息的问题:

【讨论】:

【参考方案4】:

获取访问令牌失败通常发生在您的会话过期时。

要解决这些问题:

    退出 Azure Pipelines 或 TFS。 打开 InPrivate 或隐身浏览器窗口并导航至 https://visualstudio.microsoft.com/team-services/。 如果系统提示您退出,请退出。 使用适当的凭据登录。 从列表中选择您要使用的组织。 选择要添加服务连接的项目。 通过打开设置页面创建您需要的服务连接。然后,选择服务 > 新服务连接 > Azure 资源管理器。

参考:

https://docs.microsoft.com/en-us/azure/devops/pipelines/release/azure-rm-endpoint?view=azure-devops#sessionexpired

【讨论】:

不幸的是,简单地注销然后重新登录并不能解决问题。删除和读取服务连接也不会。 这为我修好了

以上是关于在 Azure Pipelines 中使用托管标识:GetUserAccessToken:无法获取标识的访问令牌。 AAD 返回静默失败的主要内容,如果未能解决你的问题,请参考以下文章

Azure Pipelines 的所有可用托管代理池都有哪些?

访问 Azure Pipelines 中私有 Nuget 服务器中托管的 Nuget 包

Azure Pipelines 托管代理无法访问 DevOps 项目源

在 Azure Pipelines 托管 Linux 代理上运行 Cypress.io

如何在托管的 Ubuntu 代理上启用 Azure Pipelines 中的实验性 Docker 守护程序

NG 构建在 Azure Pipelines 中失败,并出现 NPM 错误 134