Azure ad b2c 如何在多租户web客户端(同一浏览器中的多个B2C身份)中验证和存储令牌

Azure ad b2c 如何在多租户web客户端(同一浏览器中的多个B2C身份)中验证和存储令牌,azure-ad-b2c,msal,msal.js,Azure Ad B2c,Msal,Msal.js,我正在设计一个单页应用程序(SPA)和API,它将支持多个租户,包括在同一个客户端浏览器中。想象一下类似于Azure门户的体验,用户可以在他们登录Azure广告的身份之间切换,但在本例中,我使用的是Azure广告B2C。所有登录都通过单个Azure AD B2C实例进行。重要的是,租户之间不一定要相互了解,因为他们是白标的——用户可能会被重定向到https://multitenant.app/tenantA并通过B2C登录,当被引导到https://multitenant.app/tenantB

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

我该怎么做: 1) 设计客户端,以便请求
https://multitenant.app/tenantX
被定向到Azure AD B2C,使用
tenantX
的规则进行登录,以及 2) 设计客户端,以便当用户导航到
https://multitenant.app/tenantX
是否在浏览器中

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

这有意义吗?有更好的办法吗?我已经讨论过如何使用服务器发布的会话cookie,以便浏览器处理“拦截请求并附加凭据”这一方面的问题,所以这可能是一个避免在客户端上维护所有这些令牌的选项


当客户登录B2C时,这是如何工作的?我是否可以充分调整/禁用B2C SSO功能,以便单个用户代理(浏览器)仍然可以获得多个不同的令牌(用于不同的身份)?

方法需要稍微不同。这就是微软在Azure门户中使用“租户选取器”的方式

  • 我们拥有您的帐户所在租户的地图
  • 然后,我们在应用程序的租户选取器UI中列出租户
  • 当您切换租户时,我们会对新资源(即所选租户)执行SSO身份验证,以获取令牌
  • 我们使用新令牌评估您在此租户订阅中的权限
  • 要在AAD B2C中进行翻译,您可以:

  • 保留标识符到“租户”的映射
  • 在身份验证时,调用API以获取租户列表。使用示例列出身份验证流中的租户
  • 用户选择租户,或者您可以像Microsoft那样选择,并具有默认首选项,在这种情况下,使用B2C先决条件跳过上述步骤。这样,用户只需在身份验证流中选择租户一次。之后,他们使用应用程序内租户选择器(继续阅读…)
  • 颁发给用户的令牌中包含租户作为声明,当此令牌到达您的API时,这将用于进行授权
  • 在SPA中,现在呈现租户选择器,使用步骤2中使用的相同API
  • 用户可以在SPA中选择一个新租户,使用id_token_hint()与所选租户一起创建一个新的B2C用户旅程。用户将通过此过程获得SSO,并获得一个新令牌,其中包含新租户作为声明

  • 我喜欢这个答案!非常感谢你!也许我对“身份”含义的思考是完全错误的,但如果我不想要SSO呢?这更像是Azure门户中我的身份列表,而不是我在选择身份后看到的可访问租户列表。那部分是怎么工作的?我假设MSAL.js支持一次使用多个身份登录到多个AAD租户(包括B2C)?如果是这样,那就行了。“ID1”看到的是
    tenata
    ,“ID2”看到的是
    tenantB
    (&也可能是
    tenantC
    ,带有SSO)。只是不知道怎么做。谢谢Azure门户中的身份列表在B2C中无法很好地转换。B2C是一个租户,用户可以在租户中拥有多个身份。他们不会像AAD的账户采集器那样让SSO进入他们的账户。B2C支持一个租户的每个会话一个登录帐户。您可以在每个用户上添加一个扩展属性,指示他们有权访问的“租户”。嗯,因此我必须在自定义策略中关闭SSO/会话行为才能实现我的目标,对吗?然后在我的应用程序中使用ID令牌和/或访问/刷新令牌在我的终端上维护多个会话?我可以在同一个浏览器客户端中为单个AAD B2C租户使用MSAL.js维护多个不同身份的令牌吗?