Azure active directory 如何为个人Microsoft帐户(MSA)实施代表(海外建筑运营管理局)流程?

Azure active directory 如何为个人Microsoft帐户(MSA)实施代表(海外建筑运营管理局)流程?,azure-active-directory,msal,Azure Active Directory,Msal,我有一个单页Javascript应用程序(SPA)。我有一个使用TypeScript/NodeJS的中间层Azure函数服务。SPA允许用户登录,并在需要时联系中间层服务以从MS Graph检索日历数据。然后,中间层需要能够代表用户定期再次检索该日历数据,而无需来自客户端的另一个明确请求 我需要同时支持Azure AD帐户和个人MSA帐户。我有一个用于SPA和一个用于中间层服务的AAD应用程序注册。对于Azure AD帐户而言,这一切“只起作用”,因为中间层从客户端接收访问令牌,从AAD将其交换

我有一个单页Javascript应用程序(SPA)。我有一个使用TypeScript/NodeJS的中间层Azure函数服务。SPA允许用户登录,并在需要时联系中间层服务以从MS Graph检索日历数据。然后,中间层需要能够代表用户定期再次检索该日历数据,而无需来自客户端的另一个明确请求

我需要同时支持Azure AD帐户和个人MSA帐户。我有一个用于SPA和一个用于中间层服务的AAD应用程序注册。对于Azure AD帐户而言,这一切“只起作用”,因为中间层从客户端接收访问令牌,从AAD将其交换为访问令牌+刷新令牌,然后使用访问令牌从MS Graph API检索数据,并使用作为OBO流一部分的刷新令牌定期刷新

我知道,由于缺乏联合同意,个人MSA账户的使用更具挑战性。关于如何使用MSA,我能找到的唯一建议是在“使用单个应用程序”部分。然而,我似乎无法做到这一点

如果我将SPA更改为在调用acquireTokenSilent(在MSAL库上)时请求中间层所需的所有相同作用域(openid配置文件电子邮件脱机访问),则会显示正确的同意对话框,但我得到的访问令牌不是JWT。我知道这是可以预料的(因为顶部的“重要”注释),但是,当我尝试使用我的中间层执行海外建筑运营管理局流程时,这会导致问题。如果我使用该非JWT访问令牌,将其发送到我的中间层服务(该服务现在使用与SPA相同的AAD应用程序注册来识别自己),然后尝试调用OBO流的AAD端点,我会得到以下错误:

AADSTS50027: JWT token is invalid or malformed.
Trace ID: a3647c0e-e7f5-4919-a457-1bd1e951f501
Correlation ID: a44f9292-1ba0-43b7-aafe-0a77e5adbc35
Timestamp: 2019-12-04 18:52:58Z
…所以它显然期待JWT

是否有办法使海外建筑运营管理局流程与个人MSA配合使用?或者,当将个人MSA与需要刷新令牌的中间层一起使用时(因此可以代表用户定期重新调用MS Graph API),这种OBO流不是正确的做法吗?如果这不是正确的做法,我的中间层如何获得一个工作刷新令牌,以便它可以定期检索一个新的访问令牌

注:我已经阅读了这篇文章,但它似乎并没有解决我面临的问题——我知道一个共同的海外建筑运营管理局模式不能同时用于AAD和个人MSA账户(令人沮丧),但我很难让任何个人MSA海外建筑运营管理局流程正常工作,暂时忽略了多少代码(如果有的话),我可能能够在Azure广告和个人MSA OBO流之间共享


谢谢

对于您所述的问题,如果前端能够获得AAD和MSA用户对Graph的成功同意,您可能不需要OBO电话来获取您想要的内容

我建议您利用MSAL的令牌缓存功能来获取您在这里寻找的内容

MSAL提供了从外部(特别是在您的情况下)刷新令牌的能力。提供了详细的走查

AAD V2允许一个应用id用于同一应用的多个实例,特别是当它们共享同一拓扑部署单元时,建议使用AAD V2

一旦应用程序的前端和后端具有相同的应用程序id

  • 为应用程序实现外部令牌缓存
  • 针对同一令牌缓存初始化前端和后端
  • 确保前端获得所有所需作用域的必要许可
  • 后端可以随时从缓存中获取
    同意的
    用户的AT。MSAL抽象了使用RT获取新AT的内部过程。这是可能的,因为应用程序id相同
  • 如果后端的MSAL出现故障(并且会定期发生,如用户更改其pwd),请将此事件保存在某个位置,并建议用户再次在前端执行登录过程