使用 Microsoft Entra B2B 将外部用户加入业务线应用程序

应用程序开发人员可以使用 Microsoft Entra B2B 在业务线 (LOB) 应用程序中加入外部用户并与之协作。 应用程序开发人员可以在集成 Microsoft Entra ID 的任意 LOB 应用程序中创建一键式邀请体验,类似于许多 Office 365 应用程序中的“共享”按钮。

优点包括:

  • 用户可以简单轻松地加入和访问 LOB 应用程序,只需几个步骤即可获得访问权限。

  • 使外部用户能够自带标识并执行单一登录 (SSO)。

  • 自动将外部标识预配到 Microsoft Entra ID。

  • 应用 Microsoft Entra 条件访问和跨租户访问策略来强制实施授权策略,例如要求多重身份验证。

集成流

若要将 LOB 应用程序与 Microsoft Entra B2B 集成,请遵循以下模式:

Screenshot shows the integration of LOB applications.

步骤 说明
1. 最终用户在 LOB 应用程序中触发“邀请”,并提供外部用户的电子邮件地址。 应用程序检查用户是否已存在,如果不存在,则继续执行步骤 2
2. 应用程序代表用户向 Microsoft Graph API 发送 POST。 它提供步骤 1 中定义的重定向 URL 和外部用户的电子邮件。
3. Microsoft Graph API 在 Microsoft Entra ID 中预配来宾用户。
4. Microsoft Graph API 返回 API 调用的成功/失败状态。 如果成功,响应将包括 Microsoft Entra 用户对象 ID 和发送到受邀用户的电子邮件的邀请链接。 可以选择禁止 Microsoft 电子邮件并发送自定义电子邮件。
5. (可选)如果要向受邀用户写入更多属性或将受邀用户添加到组,应用程序会向 Microsoft Graph API 进行额外的 API 调用。
6. (可选)Microsoft Graph API 对 Microsoft Entra ID 进行所需的更新。
7. (可选)Microsoft Graph API 将成功/失败状态返回给应用程序。
8. 应用程序使用用户的对象 ID 属性作为“不可变 ID”将用户预配到应用程序的数据库/后端用户目录。
9. 应用程序向最终用户显示成功/失败状态。

如果需要分配才能访问 LOB 应用程序,则还必须将受邀的来宾用户分配到具有相应应用程序角色的应用程序。 此操作可以通过另一个 API 调用将受邀的来宾添加到组(步骤 5-7),或者通过使用 Microsoft Entra 动态组自动实现组成员身份来完成。 使用动态组无需应用程序再次执行 API 调用。 但是,与在用户邀请后立即将用户添加到组相比,组成员身份的更新速度不会很快。

步骤 1:检查外部用户是否已存在

外部用户可能之前已接受邀请并加入。 LOB 应用程序应检查用户是否已存在于目录中。 有许多方法可以完成此操作,但最简单的方法是对 Microsoft Graph API 执行 API 调用,并将可能的匹配项呈现给受邀用户,让他们从中选择。

例如:

Application Permission: User.read.all

GET https://graph.microsoft.com/v1.0/users?$filter=othermails/any(id:id eq 'userEmail@contoso.com')  

如果在响应中收到用户的详细信息,则表示该用户已存在。 应将返回的用户呈现给受邀用户,并让他们选择要授予访问权限的外部用户。 应继续执行适当的 API 调用或触发其他过程,以授予此用户对应用程序的访问权限,而不是继续执行邀请步骤。

步骤 2:创建和发送邀请

如果目录中尚不存在外部用户,可以使用 Microsoft Entra B2B 邀请用户并将其加入 Microsoft Entra 租户。 应用程序开发人员需要确定在向 Microsoft Graph API 发出的邀请请求中包含哪些内容。

至少需要:

  • 提示最终用户提供外部用户的电子邮件地址。

  • 确定邀请 URL。 此 URL 是受邀用户在进行身份验证并兑换 B2B 邀请后重定向到的位置。 URL 可以是应用程序的通用登陆页,也可以由 LOB 应用程序根据最终用户触发邀请的位置动态确定。

邀请请求中需要考虑的其他标志和属性:

  • 受邀用户的显示名称。
  • 确定是要使用默认的 Microsoft 邀请电子邮件,还是禁用默认电子邮件以自行创建电子邮件。

应用程序收集完所需信息并确定要包含的任何其他标志或信息后,应用程序必须将请求发布到 Microsoft Graph API 邀请管理器。 确保应用程序注册在 Microsoft Entra ID 中具有相应的权限。

例如:

Delegated Permission: User.Invite.All

POST https://graph.microsoft.com/v1.0/invitations  
Content-type: application/json

{ 
"invitedUserDisplayName": "John Doe",  
"invitedUserEmailAddress": "john.doe@contoso.com",  
"sendInvitationMessage": true,  
"inviteRedirectUrl": "https://customapp.contoso.com"  
} 

注意

若要查看邀请 JSON 正文的可用选项的完整列表,请查看邀请资源类型 - Microsoft Graph v1.0

应用程序开发人员也可以使用 Microsoft Entra 自助注册或权利管理访问包加入外部用户。 可以在 LOB 应用程序中创建“邀请”按钮,以触发包含预定义的自助注册 URL 或访问包 URL 的自定义电子邮件。 然后,受邀用户自助加入并访问应用程序。

步骤 3:将其他属性写入 Microsoft Entra ID(可选)

重要

授予应用程序更新目录中用户的权限是一项高特权操作。 如果向应用程序授予这些高特权权限,则应采取措施保护和监视 LOB 应用。

组织或 LOB 应用程序可能需要存储更多信息以备将来使用,例如令牌中的声明发出或精细授权策略。 在 Microsoft Entra ID 中邀请/创建外部用户后,应用程序可以再次执行 API 调用来更新外部用户。 此操作需要应用程序具有额外的 API 权限,并且需要额外调用 Microsoft Graph API。

若要更新用户,需要使用在邀请 API 调用的响应中收到的新创建的来宾用户的对象 ID。 这是来自存在性检查或邀请的 API 响应中的 ID 值。 可以写入可能已创建的任何标准属性或自定义扩展属性。

例如:

Application Permission: User.ReadWrite.All

PATCH https://graph.microsoft.com/v1.0/users/<user's object ID> 
Content-type: application/json

{ 
"businessPhones": [ 
        "+1 234 567 8900" 
    ], 
"givenName": "John" 
"surname": "Doe", 
"extension_cf4ff515cbf947218d468c96f9dc9021_appRole": "external" 
} 

有关详细信息,请参阅更新用户 - Microsoft Graph v1.0

步骤 4:将受邀用户分配到组

注意

如果不需要用户分配即可访问应用程序,则可以跳过此步骤。

如果需要在 Microsoft Entra ID 中执行用户分配才能进行应用程序访问或角色分配,则必须将用户分配到应用程序,否则无论身份验证是否成功,用户都无法获取访问权限。 为此,应再次执行 API 调用,将受邀的外部用户添加到特定组。 可以将组分配给应用程序并映射到特定的应用程序角色。

例如:

权限:将组更新程序角色或自定义角色分配给企业应用程序,并将角色分配的范围限定为仅此应用程序应更新的组。 或者在 Microsoft Graph API 中分配 group.readwrite.all 权限。

POST https://graph.microsoft.com/v1.0/groups/<insert group id>/members/$ref 
Content-type: application/json

{ 
"@odata.id": "https://graph.microsoft.com/v1.0/directoryObjects/<insert user id>" 
} 

有关详细信息,请参阅添加成员 - Microsoft Graph v1.0

或者,可以使用 Microsoft Entra 动态组,该动态组可以根据用户的属性自动将用户分配到组。 但是,如果最终用户访问权限有时效性,则不建议这样做,因为动态组可能需要最长 24 小时才能填充。

如果希望使用动态组,则不需要通过另一个 API 调用将用户显式添加到组。 创建一个动态组,该动态组会根据可用属性(如 userType、email 或自定义属性)自动将用户添加为组的成员。 有关详细信息,请参阅创建或编辑动态组并获取状态

步骤 5:将受邀用户预配到应用程序

将受邀的外部用户预配到 Microsoft Entra ID 后,Microsoft Graph API 将返回包含必要用户信息(如对象 ID 和电子邮件)的响应。 然后,LOB 应用程序可以将用户预配到自己的目录/数据库。 根据应用程序使用的应用程序类型和内部目录类型,此预配的实际实现会有所不同。

在 Microsoft Entra ID 和应用程序中预配外部用户后,LOB 应用程序现在可以通知发起邀请的最终用户该过程已成功。 受邀用户可以使用自己的标识获取 SSO,而无需邀请组织加入并颁发额外的凭据。 Microsoft Entra ID 可以强制实施授权策略,例如条件访问、Microsoft Entra 多重身份验证和基于风险的标识保护。

其他注意事项

  • 确保在 LOB 应用程序中完成正确的错误处理。 应用程序应验证每个 API 调用是否成功。 如果失败,则需要再次尝试或向最终用户显示错误消息。

  • 如果需要 LOB 应用程序在外部用户收到邀请后对其进行更新,请考虑授予自定义角色,该角色允许应用程序仅更新用户并将范围分配给动态管理单元。 例如,可以创建动态管理单元,以包含“用户类型 = 来宾”的所有用户。 将外部用户加入 Microsoft Entra ID 后,需要花费一些时间将其添加到管理单元。 因此,LOB 应用程序需要在一段时间后尝试更新用户,如果出现延迟,可能需要多次尝试。 尽管存在延迟,但这是使 LOB 应用程序能够更新外部用户而不授予其更新目录中用户的权限的最佳方法。