B2B 与 Microsoft Graph
B2B with Microsoft Graph
您可能知道,我正在创建一个使用 B2B 功能的多租户 Azure 应用程序。
我正在测试 B2B 功能,经过一些研究后我得到了一个工作样本。
小总结:用户根据公共权限进行身份验证,第一个令牌是通过带有授权码的公共权限获取的,从那时起,每次我需要服务客户端时,我都会尝试从 'current tenants' 权限中获取这些令牌.
当我请求 'Me' 时,它只对房客有效。当我向受信任的租户请求我时,我得到一个错误,我的用户标识符在目录中不存在。可能是因为用户实际上并不存在于受信任的租户中。
当我请求用户时,它工作正常。我可以同时获得家庭租户用户和受信任的租户用户。
这是正常行为吗?
这是我需要以编程方式处理的事情,还是可以通过使用 AD 图来解决?
(所以当我知道我需要用户信息时,只需查询家庭租户?)
或者这是一个错误?
如有任何想法,我们将不胜感激!
如果您使用公共端点,通过 B2B 协作功能添加到目录的来宾将无法在多租户应用程序或 Microsoft Graph 上正常工作。
公共端点将始终根据 his/her 家庭租户对用户进行身份验证,而不是针对他是访客的任何租户。
为了成功查询访客的 /me,您需要让他们通过作为访客的租户的租户特定端点登录。
查看我对另一个 post 的回答以获得更深入的解释/上下文:
我注意到当你想在租户之间切换时,你需要对当前租户重新授权。
我是这样工作的:
1. 首次登录需要针对公共端点进行。
2.每次我需要某个资源的token时,我都会尝试静默获取token。
=> 这会抛出 2 个不同的 AdalSilentTokenAcquisitionException
- 缓存中未找到任何内容,也未找到刷新令牌
=> 在这种情况下,我再次将用户重定向到登录页面。
- 当您在租户之间切换时,这是您第一次使用您信任的租户登录,您可能会收到类似这样的错误:用户或管理员应获得此应用程序的许可。尽管他的家庭租户的管理员已将应用程序添加到家庭租户的目录中。谁知道为什么需要这种同意?因此,租户 A 和租户 B 的管理员都已获得同意。为什么 A 中来自 B 的受信任用户仍然需要以某种方式同意?
我能够通过将用户重定向到授权请求来触发同意流程 URL。
因此,当我收到 AdalSilentTokenAcquisitionException,并且错误代码为 "failed_to_acquire_token_silently" 时,我不得不在清除缓存后将用户重定向到由 authContext (authenticationContext.GetAuthorizationRequestUrlAsync) 生成的 URL,不将找到刷新令牌,然后重定向用户以退出。
您可能知道,我正在创建一个使用 B2B 功能的多租户 Azure 应用程序。
我正在测试 B2B 功能,经过一些研究后我得到了一个工作样本。
小总结:用户根据公共权限进行身份验证,第一个令牌是通过带有授权码的公共权限获取的,从那时起,每次我需要服务客户端时,我都会尝试从 'current tenants' 权限中获取这些令牌.
当我请求 'Me' 时,它只对房客有效。当我向受信任的租户请求我时,我得到一个错误,我的用户标识符在目录中不存在。可能是因为用户实际上并不存在于受信任的租户中。
当我请求用户时,它工作正常。我可以同时获得家庭租户用户和受信任的租户用户。
这是正常行为吗? 这是我需要以编程方式处理的事情,还是可以通过使用 AD 图来解决? (所以当我知道我需要用户信息时,只需查询家庭租户?) 或者这是一个错误?
如有任何想法,我们将不胜感激!
如果您使用公共端点,通过 B2B 协作功能添加到目录的来宾将无法在多租户应用程序或 Microsoft Graph 上正常工作。
公共端点将始终根据 his/her 家庭租户对用户进行身份验证,而不是针对他是访客的任何租户。
为了成功查询访客的 /me,您需要让他们通过作为访客的租户的租户特定端点登录。
查看我对另一个 post 的回答以获得更深入的解释/上下文:
我注意到当你想在租户之间切换时,你需要对当前租户重新授权。 我是这样工作的: 1. 首次登录需要针对公共端点进行。 2.每次我需要某个资源的token时,我都会尝试静默获取token。
=> 这会抛出 2 个不同的 AdalSilentTokenAcquisitionException
- 缓存中未找到任何内容,也未找到刷新令牌 => 在这种情况下,我再次将用户重定向到登录页面。
- 当您在租户之间切换时,这是您第一次使用您信任的租户登录,您可能会收到类似这样的错误:用户或管理员应获得此应用程序的许可。尽管他的家庭租户的管理员已将应用程序添加到家庭租户的目录中。谁知道为什么需要这种同意?因此,租户 A 和租户 B 的管理员都已获得同意。为什么 A 中来自 B 的受信任用户仍然需要以某种方式同意?
我能够通过将用户重定向到授权请求来触发同意流程 URL。 因此,当我收到 AdalSilentTokenAcquisitionException,并且错误代码为 "failed_to_acquire_token_silently" 时,我不得不在清除缓存后将用户重定向到由 authContext (authenticationContext.GetAuthorizationRequestUrlAsync) 生成的 URL,不将找到刷新令牌,然后重定向用户以退出。