你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Azure Active Directory B2C 中的自定义策略为多租户 Microsoft Entra ID 设置登录

开始之前,可以使用“选择策略类型”选择器来选择要设置的策略类型。 Azure Active Directory B2C 提供了两种定义用户如何与应用程序交互的方法:通过预定义的用户流,或者通过可完全配置的自定义策略。 对于每种方法,本文中所需的步骤都不同。

此功能仅适用于自定义策略。 对于设置步骤,请在前面的选择器中选择“自定义策略”。

本文介绍如何使用 Microsoft Entra ID 的多租户终结点为用户启用登录。 允许来自多个 Microsoft Entra 租户的用户使用 Azure AD B2C 进行登录,而不必为每个租户配置标识提供者。 但是,任何这些租户中的来宾成员都将无法登录。 为此,你需要单独配置每个租户

先决条件

注意

本文假设在先决条件中提到的前面步骤中使用了 SocialAndLocalAccounts 初学者包。

注册 Microsoft Entra 应用

要在 Azure Active Directory B2C (Azure AD B2C) 中为使用 Microsoft Entra 帐户的用户启用登录,你需要在 Azure 门户中创建应用程序。 有关详细信息,请参阅将应用程序注册到 Microsoft 标识平台

  1. 登录 Azure 门户

  2. 如果有权访问多个租户,请选择顶部菜单中的“设置”图标,切换到“目录 + 订阅”菜单中的 Microsoft Entra ID 租户

  3. 选择 Azure 门户左上角的“所有服务”,然后搜索并选择“应用注册” 。

  4. 选择“新注册”。

  5. 输入应用程序的名称。 例如 Azure AD B2C App

  6. 为此应用程序选择“任何组织目录(任何 Microsoft Entra 目录 - 多租户)中的帐户”。

  7. 对于“重定向 URI”,接受值 Web,并以全小写字母输入以下 URL,其中 your-B2C-tenant-name 将替换为 Azure AD B2C 租户的名称。

    https://your-B2C-tenant-name.b2clogin.com/your-B2C-tenant-name.onmicrosoft.com/oauth2/authresp
    

    例如,https://fabrikam.b2clogin.com/fabrikam.onmicrosoft.com/oauth2/authresp

    如果使用自定义域,请输入 https://your-domain-name/your-tenant-name.onmicrosoft.com/oauth2/authresp。 将 your-domain-name 替换为你的自定义域,将 your-tenant-name 替换为租户的名称。

  8. 选择“注册”。 记录“应用程序(客户端) ID”,以便在后续步骤中使用。

  9. 依次选择“证书和机密”、“新建客户端密码”。

  10. 为机密输入说明,选择到期时间,然后选择“添加”。 记录机密的值,以便在后续步骤中使用。

配置可选声明

如果要从 Microsoft Entra ID 获取 family_namegiven_name 声明,可以在 Azure 门户 UI 或应用程序清单中为应用程序配置可选声明。 有关详细信息,请参阅如何向 Microsoft Entra 应用提供可选声明

  1. 登录 Azure 门户。 搜索并选择 Microsoft Entra ID
  2. 从“管理”部分中选择“应用注册” 。
  3. 在列表中选择要为其配置可选声明的应用程序。
  4. 在“管理”部分中,选择“令牌配置”。
  5. 选择“添加可选声明”。
  6. 对于“令牌类型”,选择“ID”。
  7. 选择要添加的可选声明:family_namegiven_name
  8. 选择“添加” 。 如果出现“打开 Microsoft Graph 电子邮件权限(在令牌中显示声明所需)”,请启用它,然后再次选择“添加”。

[可选] 验证应用真实性

发布者验证可帮助用户了解已注册应用的真实性。 已验证应用意味着应用的发布者已使用其 Microsoft 合作伙伴网络 (MPN) 验证其标识。 了解如何将应用标记为“发布者已验证”

创建策略密钥

需将创建的应用程序密钥存储在 Azure AD B2C 租户中。

  1. 如果有权访问多个租户,请选择顶部菜单中的“设置”图标,切换到“目录 + 订阅”菜单中的 Azure AD B2C 租户
  2. 选择 Azure 门户左上角的“所有服务”,然后搜索并选择“Azure AD B2C” 。
  3. 在“策略”下,选择“Identity Experience Framework”。
  4. 选择“策略密钥”,然后选择“添加”。
  5. 对于“选项”,请选择 Manual
  6. 输入策略密钥的名称。 例如,AADAppSecret。 前缀 B2C_1A_ 会在创建密钥时自动添加到密钥的名称,因此它在以下部分的 XML 中的引用是 B2C_1A_AADAppSecret。
  7. 在“机密”中,输入你之前记录的客户端密码。
  8. 在“密钥用法”处选择 Signature
  9. 选择“创建”。

将 Microsoft Entra ID 配置为标识提供者

若要让用户使用 Microsoft Entra 帐户登录,需要将 Microsoft Entra ID 定义为 Azure AD B2C 可通过终结点与其进行通信的声明提供程序。 该终结点将提供一组声明,Azure AD B2C 使用这些声明来验证特定的用户是否已完成身份验证。

通过在策略的扩展文件中将 Microsoft Entra ID 添加到 ClaimsProvider 元素,可以将 Microsoft Entra ID 定义为声明提供程序。

  1. 打开 SocialAndLocalAccounts/TrustFrameworkExtensions.xml 文件(请参阅在先决条件中使用的文件)。

  2. 找到 ClaimsProviders 元素。 如果该元素不存在,请在根元素下添加它。

  3. 如下所示添加新的 ClaimsProvider

    <ClaimsProvider>
      <Domain>commonaad</Domain>
      <DisplayName>Common AAD</DisplayName>
      <TechnicalProfiles>
        <TechnicalProfile Id="AADCommon-OpenIdConnect">
          <DisplayName>Multi-Tenant AAD</DisplayName>
          <Description>Login with your Contoso account</Description>
          <Protocol Name="OpenIdConnect"/>
          <Metadata>
            <Item Key="METADATA">https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration</Item>
            <!-- Update the Client ID below to the Application ID -->
            <Item Key="client_id">00000000-0000-0000-0000-000000000000</Item>
            <Item Key="response_types">code</Item>
            <Item Key="scope">openid profile</Item>
            <Item Key="response_mode">form_post</Item>
            <Item Key="HttpBinding">POST</Item>
            <Item Key="UsePolicyInRedirectUri">false</Item>
            <Item Key="DiscoverMetadataByTokenIssuer">true</Item>
            <!-- The key below allows you to specify each of the Azure AD tenants that can be used to sign in. Update the GUIDs below for each tenant. -->
            <Item Key="ValidTokenIssuerPrefixes">https://login.microsoftonline.com/00000000-0000-0000-0000-000000000000,https://login.microsoftonline.com/11111111-1111-1111-1111-111111111111</Item>
            <!-- The commented key below specifies that users from any tenant can sign-in. Uncomment if you would like anyone with an Azure AD account to be able to sign in. -->
            <!-- <Item Key="ValidTokenIssuerPrefixes">https://login.microsoftonline.com/</Item> -->
          </Metadata>
          <CryptographicKeys>
            <Key Id="client_secret" StorageReferenceId="B2C_1A_AADAppSecret"/>
          </CryptographicKeys>
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="oid"/>
            <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="given_name" />
            <OutputClaim ClaimTypeReferenceId="surName" PartnerClaimType="family_name" />
            <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" />
            <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" AlwaysUseDefaultValue="true" />
            <OutputClaim ClaimTypeReferenceId="identityProvider" PartnerClaimType="iss" />
          </OutputClaims>
          <OutputClaimsTransformations>
            <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName"/>
            <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName"/>
            <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId"/>
            <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromAlternativeSecurityId"/>
          </OutputClaimsTransformations>
          <UseTechnicalProfileForSessionManagement ReferenceId="SM-SocialLogin"/>
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider>
    
  4. 在 ClaimsProvider 元素下,将 Domain 的值更新为可用于与其他标识提供者进行区分的唯一值

  5. 在 TechnicalProfile 元素下,更新 DisplayName 的值,例如 Multi-Tenant AAD。 此值会显示在登录页中的登录按钮上。

  6. client_id 设置为你之前注册的 Microsoft Entra 多租户应用程序的应用程序 ID。

  7. 在 CryptographicKeys 下,更新 StorageReferenceId 的值为之前创建的策略密钥的名称。 例如,B2C_1A_AADAppSecret

限制访问

使用 https://login.microsoftonline.com/ 作为 ValidTokenIssuerPrefixes 的值后,将允许所有 Microsoft Entra 用户登录到你的应用程序。 更新有效令牌颁发者列表,并且仅允许可以登录的一组特定 Microsoft Entra 租户用户进行访问。

若要获取值,请查看你希望让用户从其登录的每个 Microsoft Entra 租户的 OpenID Connect 发现元数据。 元数据 URL 的格式类似于 https://login.microsoftonline.com/your-tenant/v2.0/.well-known/openid-configuration,其中 your-tenant 为你的 Microsoft Entra 租户名称。 例如:

https://login.microsoftonline.com/fabrikam.onmicrosoft.com/v2.0/.well-known/openid-configuration

对每个应该用于登录的 Microsoft Entra 租户执行以下步骤:

  1. 为该租户打开浏览器并转到 OpenID Connect 元数据 URL。 查找 issuer 对象,然后记录其值。 它看起来应该类似于 https://login.microsoftonline.com/00000000-0000-0000-0000-000000000000/v2.0
  2. 复制并粘贴该值到 ValidTokenIssuerPrefixes 密钥。 多个证书颁发者以逗号隔开。 之前的 ClaimsProvider XML 示例中显示了一个出现两位证书颁发者的示例。

添加用户旅程

此时,标识提供者已设置,但还不能在任何登录页中使用。 如果你没有自己的自定义用户旅程,请创建现有模板用户旅程的副本,否则,请继续执行下一步。

  1. 打开初学者包中的 TrustFrameworkBase.xml 文件。
  2. 找到并复制包含 Id="SignUpOrSignIn"UserJourney 元素的完整内容。
  3. 打开 TrustFrameworkExtensions.xml 并找到 UserJourneys 元素。 如果该元素不存在,请添加一个。
  4. 将复制的 UserJourney 元素的完整内容粘贴为 UserJourneys 元素的子级。
  5. 对用户旅程的 ID 进行重命名。 例如,Id="CustomSignUpSignIn"

将标识提供者添加到用户旅程

目前你已拥有用户旅程,请将新的标识提供者添加到用户旅程。 首先添加一个“登录”按钮,然后将该按钮链接到某个操作。 该操作是你之前创建的技术配置文件。

  1. 在用户旅程中,查找包含 Type="CombinedSignInAndSignUp"Type="ClaimsProviderSelection" 的业务流程步骤元素。 这通常是第一个业务流程步骤。 ClaimsProviderSelections 元素包含用户可以用来登录的标识提供者列表。 元素的顺序将决定向用户显示的登录按钮的顺序。 添加 ClaimsProviderSelection XML 元素。 将 TargetClaimsExchangeId 的值设置为易记名称。

  2. 在下一个业务流程步骤中,添加 ClaimsExchange 元素。 将 ID 设置为目标声明交换 ID 的值。将 TechnicalProfileReferenceId 的值更新为之前创建的技术配置文件的 ID 。

下面的 XML 演示了使用标识提供者进行用户旅程的前两个业务流程步骤:

<OrchestrationStep Order="1" Type="CombinedSignInAndSignUp" ContentDefinitionReferenceId="api.signuporsignin">
  <ClaimsProviderSelections>
    ...
    <ClaimsProviderSelection TargetClaimsExchangeId="AzureADCommonExchange" />
  </ClaimsProviderSelections>
  ...
</OrchestrationStep>

<OrchestrationStep Order="2" Type="ClaimsExchange">
  ...
  <ClaimsExchanges>
    <ClaimsExchange Id="AzureADCommonExchange" TechnicalProfileReferenceId="AADCommon-OpenIdConnect" />
  </ClaimsExchanges>
</OrchestrationStep>

配置信赖方策略

信赖方策略(例如 SignUpSignIn.xml)指定 Azure AD B2C 将执行的用户旅程。 在信赖方内查找 DefaultUserJourney 元素。 更新 ReferenceId,使其与已在其中添加标识提供者的用户旅程 ID 匹配。

在以下示例中,对于 CustomSignUpSignIn 用户旅程,将 ReferenceId 设置为 CustomSignUpSignIn

<RelyingParty>
  <DefaultUserJourney ReferenceId="CustomSignUpSignIn" />
  ...
</RelyingParty>

上传自定义策略

  1. 登录 Azure 门户
  2. 在门户工具栏中选择“目录 + 订阅”图标,然后选择包含 Azure AD B2C 租户的目录。
  3. 在 Azure 门户中,搜索并选择“Azure AD B2C”。
  4. 在“策略”下,选择“Identity Experience Framework”。
  5. 选择“上传自定义策略”,然后上传已更改的两个策略文件,其顺序为:先上传扩展策略(例如 TrustFrameworkExtensions.xml),然后上传信赖方策略(例如 SignUpSignIn.xml)。

测试自定义策略

  1. 选择信赖方策略,例如 B2C_1A_signup_signin
  2. 对于“应用程序”,请选择前面注册的 Web 应用程序。 “回复 URL”应显示为 https://jwt.ms
  3. 选择“立即运行”按钮。
  4. 在注册或登录页面上,选择“通用 Microsoft Entra ID”以使用 Microsoft Entra 帐户登录。

若要测试多租户登录功能,请使用存在于另一个 Microsoft Entra 租户的用户的凭据执行最后两个步骤。 复制“立即运行终结点”,然后在私密浏览器窗口中将其打开,例如,在 Google Chrome 中打开 Incognito Mode 或在 Microsoft Edge 中打开 InPrivate 窗口。 通过在私密浏览器窗口中打开,你可以不使用任何当前缓存的 Microsoft Entra 凭据测试整个用户历程。

如果登录过程成功,浏览器将重定向到 https://jwt.ms,后者显示 Azure AD B2C 返回的令牌内容。

后续步骤