我有一个在Azure App Services上运行的Web应用程序。前端(javascript + html + css)与后端(Flask)进行通信。两者都在同一个应用服务实例上运行。
我的应用受Active Directory身份验证保护(使用Azure门户配置)。
对应用的用户身份验证效果很好。当用户导航到应用程序时,会将其重定向到我们的Azure广告租户的登录名。当他们尝试登录时,他们对该应用的许可由其成员控制为天蓝色广告组。 此位按预期工作
挑战在于前端需要发送经过身份验证的请求,以便它们实际到达后端。必须使用服务主体令牌而不是用户的令牌对它们进行身份验证。为此,我们正在使用新的推荐方法;托管服务标识(MSI),而不是直接服务主体帐户工作流程。
这有两个阶段:
1)添加授权标头 2)确保MSI主体具有访问权(即属于AD组)
1)服务器使用以下代码生成访问令牌:
credentials = azure_active_directory.MSIAuthentication()
session = credentials.signed_session()
return session.headers.get("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)我有一个额外的授权层,即广告组,限制访问权限应用程序给少数用户而不是整个租户。
答案 0 :(得分:0)
我相信你全都倒退了。
您的方案是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时。