我正在用python/Flask创建一个非常小的webapp,在Azure App Service下运行。该应用程序受Azure AD身份验证保护,该身份验证依赖于easyauth。应用程序注册有两个已配置的权限/范围:https://graph.microsoft.com/User.Read (获取有关当前用户的信息)和https://management.azure.com/user_impersonation (在Azure管理基础设施上运行查询)。
每当我访问这个应用程序时,我都必须登录。这很好。我被提供了许多头文件,包括X-Ms-Token-Aad-Access-Token,它似乎包含一个访问令牌。
当我访问Microsoft Graph时(因此使用https://management.azure.com/user_impersonation作用域),一切都很好(为了空间和清晰度,我去掉了一些错误处理):
@app.route("/userinfo")
def userinfo():
token = request.headers.get("X-Ms-Token-Aad-Access-Token")
data = requests.get(
"https://graph.microsoft.com/oidc/userinfo",
headers={ 'Authorization': f"Bearer {token}" },
).json()当我运行几乎相同的代码来获取web应用程序的列表时,它会失败,并显示一个简单的"AuthenticationFailed“代码(也没有错误处理):
@app.route("/webapp")
def webapp():
token = request.headers.get("X-Ms-Token-Aad-Access-Token")
data = requests.get(
f"https://management.azure.com/subscriptions/{subscription_id}/providers/Microsoft.Web/sites?api-version=2019-08-01",
headers={ 'Authorization': f"Bearer {token}" },
).json()我怀疑app service / easyauth提供的令牌不支持https://management.azure.com/user_impersonation作用域,即使在web应用程序设置中指定了它。但我真的不知道。然而,它不起作用。我知道这个。
显而易见的问题是:这是可能的吗?我是不是漏掉了什么明显的东西?有没有简单的解决方案?
(使用MSAL而不是声明机制似乎是可行的,但我希望尽可能多地使用平台服务)
发布于 2021-04-01 14:50:41
可以,停那儿吧。
要调用Azure REST API,你需要在你的web应用的authsettings中利用additionalLoginParams,导航到resource explorer -> find your web app -> add ["resource=https://management.azure.com"] To additionalLoginParams like below -> PUT。

配置完成后,当用户登录应用程序时,它会让你同意权限https://management.azure.com/user_impersonation,同意后,X-Ms-Token-Aad-Access-Token将能够调用Azure REST API,即https://management.azure.com,但它将无法再调用Microsoft Graph,因为一个访问令牌只能用于一个API资源,要获取用户信息,您可以直接点击https://webappname.azurewebsites.net/.auth/me,它将包含用户信息。此外,请确保您的用户帐户在您的订阅中具有RBAC角色,例如Contributor、Owner,因为令牌的权限来自用户。
有关更多详细信息,请参阅此similar issue。
https://stackoverflow.com/questions/66835707
复制相似问题