首页 > 解决方案 > 您可以在实例化 MSAL ConfidentialClientApplication 后更改它的权限吗?

问题描述

我正在使用客户端凭据流开发多租户 Azure AD 应用程序,并依赖MSAL for Python来获取调用 MS Graph API 所需的令牌。该应用程序本身是一个守护程序和 Web 应用程序的混合体,这意味着任何用户都不能直接登录,但无论是在调用时还是定期地,它都需要代表他们进行 MS Graph API 调用。我已正确注册应用程序,并且管理员已授予所有租户的应用程序权限。

在请求此处此处描述的令牌后,对于具有相应权限的主租户,我成功地为该租户中的用户调用了 Graph API。但是,当我尝试为另一个租户中的用户调用 MS Graph API 时(大概如预期的那样),它会导致错误的响应。

我确信权限已被授予,因为如果我使用不同的权限重新实例化 msal 或按照此处/token所述手动调用端点,我会成功检索相应用户的 Graph API 数据。

我没有发布任何代码,因为这些问题与 Python 本身的设计和 MSAL 更相关。此外,为了进行完整性检查,我尝试在实例化的 msal 应用程序中直接设置权限字段,但这并没有改变。在对 MSAL 源进行更多挖掘之后,我意识到它并没有改变,因为应用程序的初始化在构造函数中创建了权限,并且使用既不使用ConfidentialClientApplication(...).aquire_token_for_client(...)也不使用Client(...).aquireTokenForClient(...)前者依赖于权限本身。最后,我在存储库中找不到任何问题,在文档中找不到任何问题,也找不到任何关于 SO 的问题能够回答我的问题。

因此,由于我需要与之交互的租户可能会发生变化,而且我觉得每次我需要在自己的端点中请求访问令牌时都实例化 MSAL 应用程序会产生一些开销,所以我的问题是:

  1. 我错过了一些明显的东西吗?
  2. 创建 msal 实例后是否可以更改权限?
  3. 如果不可能,在此用例中为每个租户处理获取访问令牌的最佳方式是什么?

提前请你!

编辑: 我设法找到了一些可能有用的东西。是Azure提供的一个示例flask app,每次调用_build_msal_app()方法都会创建msal app。尽管如此,我的问题仍然是这是否是最佳方式,即使答案可能与 Azure 的实现一致。

标签: pythonactive-directoryazure-active-directorymicrosoft-graph-apimsal

解决方案


推荐阅读