【发布时间】: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