【问题标题】:Signing API requests on Azure App Services using MSI Access Token使用 MSI 访问令牌在 Azure 应用服务上签署 API 请求
【发布时间】:2018-06-06 06:10:43
【问题描述】:

我有一个在 Azure 应用服务上运行的 Web 应用程序。前端(javascript + html + css)与后端(Flask)通信。两者都在同一个应用服务实例上运行。

我的应用受 Active Directory 身份验证(使用 Azure 门户配置)保护。

应用程序的用户身份验证运行良好。当用户导航到应用程序时,他们会被重定向到我们的 azure AD 租户的登录名。当他们尝试登录时,他们对应用程序的权限由他们在 Azure AD 组中的成员身份控制。 此位按预期工作

挑战在于前端需要发送经过身份验证的请求才能真正到达后端。它们必须使用服务主体令牌而不是用户令牌进行身份验证。为此,我们正在使用新的推荐方法;托管服务标识 (MSI),而不是直接服务主体帐户工作流。

这有两个阶段:

1) 添加授权头 2) 确保 MSI 主体具有访问权限(即属于 AD 组)

1) 服务器使用以下代码生成访问令牌:

credentials = azure_active_directory.MSIAuthentication()
session = credentials.signed_session()
return session.headers.get("Authorization")

然后我们添加 {"Authorization": "Bearer"} 标头,其中是上述代码的结果。

这似乎按预期工作 - 我们看到很长的字母数字访问令牌

2) 棘手的一点是确保将 MSI 添加到 AD 组。 myapps.microsoft.com 和 mygroups.microsoft.com 上的 GUI 只允许添加用户。相反,我使用 Azure CLI 并运行以下命令:

a) 检索 MSI 主体 ID msiobjectid=$(az webapp identity show --resource-group <resource-group-name> --name <azure app services name> --query principalId)

b) 将主体添加到组 az ad group member add --group <group name> --member-id $msiobjectid

我们仍然收到 401 Unauthorized 并且我们已经用尽了所有文档 :(

我应该注意,大约一个小时前我才完成了第 2 步(通过 Azure CLI 将主体添加到 azure AD 组)。也许有延迟?

编辑:我的方案最接近https://github.com/uglide/azure-content/blob/master/articles/app-service-api/app-service-api-dotnet-service-principal-auth.md,除了 a) 我使用的是 MSI,而不是直接服务主体,b) 我有一个额外的授权层,即广告组,限制对应用程序的访问少数用户而不是整个租户。

【问题讨论】:

  • 等一下,您是作为机密客户接近您的 SPA 前端还是我看错了?
  • 我不确定你在那儿得到了什么,或者为什么它是相关的应用程序是单页还是多页。该应用程序只能通过由 AD 组控制的内部用户访问。应用程序本身发送与用户无权访问的资源交互的 API 请求,这就是为什么此位使用服务帐户工作流,而不仅仅是传递用户凭据。
  • 是的,我看错了。您尝试使用该 Bearer 令牌访问哪个资源(例如,您的 aud 声明中有什么内容?)
  • @evilSnobu,我还没有尝试访问 azure 资源。关键是它甚至没有进入我的 API。前端向我的后端发送一个 http 请求,然后返回 401。
  • 并且需要明确的是,不是我的 API 重新调整 401,而是授权提供者! IE。活动目录。

标签: azure azure-active-directory access-token


【解决方案1】:

我相信你把这一切都搞反了。

您的方案是 SPA + 后端。

您需要实现的是 OAuth 2.0 隐式授权流程,如 here 所述。

图表来源:dzimchuk.net

将生成的 access_token 放置在用户代理的会话存储中,然后您可以调用您的后端。使用adal.js 让您的生活更轻松。

由于您的 Python 后端 IS 是一个机密客户端,您现在可以从 MSI 端点为所需的受众(Azure 资源)请求访问令牌,调用它然后过滤结果,使其与您的访问权限逻辑。

请注意,在撰写本文时only a subset of Azure resources are able to consume MSI-issued access tokens

【讨论】:

  • 我听取了您的建议...我已让前端使用用户的访问令牌而不是 MSI 令牌向后端发送请求。然后,API 可以在需要与 Azure 资源交互时使用 MSI 令牌。我的后端“在请求处理程序之前”添加了授权标头,而不是从前端发送请求。但是,我收到了一个看起来很愚蠢的 CORS 错误。 login.windows.net 拒绝我的应用程序的请求,因为它不允许来源。我显然无法控制该域,并且使用门户设置了身份验证。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 2021-11-27
  • 2019-03-23
  • 2018-08-22
  • 1970-01-01
  • 2020-07-05
  • 2018-02-28
  • 2020-07-19
  • 1970-01-01
相关资源
最近更新 更多