如何在多租户 Web 客户端中对令牌进行身份验证和存储(同一浏览器中的多个 B2C 标识)



我正在设计一个单页应用程序 (SPA( 和 API,它将支持多个租户,包括在同一客户端浏览器中。想象一下类似于 Azure 门户的体验,用户可以在他们用来登录 Azure AD 的标识之间切换,但在本例中我使用的是 Azure AD B2C。所有登录都通过单个 Azure AD B2C 实例进行。重要的是,租户不一定必须相互了解,因为他们是白标的 - 用户可能会被重定向到https://multitenant.app/tenantA并通过 B2C 登录,并且在定向到https://multitenant.app/tenantB并通过 B2C 登录时具有完全不同的体验。两个租户不需要在客户端上共享数据。

我该怎么做: 1( 设计客户端,以便对https://multitenant.app/tenantX的请求定向到 Azure AD B2C,以便使用tenantX规则进行登录,以及 2( 设计客户端,以便 MSAL.js 库正确提供一个令牌存储区,其中包含特定于tenantX的令牌,当用户在浏览器中导航到https://multitenant.app/tenantX时?

目前,我预计需要拦截对客户端上后端 API 的请求,确定是否需要首先重定向到 B2C 才能登录到请求所针对的租户,并将该租户的相应访问令牌附加到 API 请求。(所有这些都是假设我使用隐式流,以便我在客户端上拥有可用的访问和刷新令牌。

这有意义吗?有没有更好的方法?我一直在争论使用服务器发出的会话cookie,以便浏览器处理其中的"拦截请求和附加凭据"方面,所以也许这是一个可以避免在客户端上维护所有这些令牌的选项?

当客户端登录到 B2C 时,这如何工作?我是否可以充分调整/禁用 B2C SSO 功能,以便单个用户代理(浏览器(仍然可以获取多个不同的令牌(针对不同的标识(?

方法需要有点不同。这就是Microsoft Azure 门户中使用其"租户选取器"执行此操作的方法。

  1. 我们持有你的帐户所在的租户的映射
  2. 然后,我们在应用的租户选取器 UI 中列出租户
  3. 切换租户时,我们会对新资源(即所选租户(执行 SSO 身份验证,以获取该资源的令牌
  4. 我们使用新令牌来评估你在此租户订阅中的权利

若要在 AAD B2C 中翻译此内容,可以:

  1. 保存标识符到"租户"的映射
  2. 在身份验证时,调用 API 以获取租户列表。使用此示例列出身份验证流中的租户
  3. 用户选择租户,或者你可能像Microsoft一样执行此操作并具有默认首选项,在这种情况下,将使用 B2C 前提条件跳过上述步骤。这样,用户只需在身份验证流中选择租户一次。之后,他们使用应用内租户选取器(请继续阅读...
  4. 颁发给用户的令牌将租户作为声明包含在其中,然后当此令牌到达时,这将用于执行授权 API 是你的 API。
  5. 在 SPA 中,现在呈现租户选取器,基本上使用与步骤 2 中使用的相同 API
  6. 用户可以在 SPA 中选择新租户,使用id_token_hint(示例(为所选租户设定新的 B2C 用户旅程种子。用户将在此旅程中获取 SSO,并获取包含新租户的新令牌作为声明。

最新更新