在 Azure Active Directory B2C 中使用自定义策略将 AD FS 添加为 OpenID Connect 标识提供者

重要

自 2025 年 5 月 1 日起,Azure AD B2C 将不再可供新客户购买。 在我们的常见问题解答中了解详细信息

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

先决条件

创建 AD FS 应用程序

若要在 Azure Active Directory B2C(Azure AD B2C)中使用 AD FS 帐户为用户启用登录,请在 AD FS 中创建应用程序组。 有关详细信息,请参阅 使用 OpenID Connect 和 AD FS 2016 及更高版本生成 Web 应用程序

若要创建应用程序组,请执行以下步骤:

  1. 服务器管理器中,选择 “工具”,然后选择 “AD FS 管理”。
  2. 在”AD FS管理”中,右键单击“应用程序组”,然后选择“添加应用程序组” 。
  3. 在“应用程序组向导 欢迎 ”屏幕上:
    1. 输入应用程序 的名称 。 例如, Azure AD B2C 应用程序
    2. Client-Server 应用程序下,选择 访问 Web 应用程序模板的 Web 浏览器
    3. 选择“下一步”。
  4. 在“应用程序组向导”的“本机应用程序”屏幕上
    1. 复制“客户端标识符”值。 客户端标识符是 AD FS 应用程序 ID。 本文稍后需要应用程序 ID。
    2. 重定向 URI 中,输入 https://your-tenant-name.b2clogin.cn/your-tenant-name.partner.onmschina.cn/oauth2/authresp,然后 添加。 将 your-tenant-name 替换为租户的名称。
    3. 选择 “下一步”,然后选择“ 下一步”,然后再次选择 “下一步 ”以完成应用注册向导。
    4. 选择 关闭

配置应用声明

在此步骤中,配置 AD FS 应用程序返回到 Azure AD B2C 的声明。

  1. 应用程序组中,选择你创建的应用程序。

  2. 在应用程序属性窗口中的 “应用程序”下,选择 “Web 应用程序”。 然后选择“编辑”。 显示如何编辑 Web 应用程序的屏幕截图。

  3. 选择“ 颁发转换规则 ”选项卡。然后选择“ 添加规则”。

  4. 声明规则模板中,选择“ 发送 LDAP 属性作为声明”,然后选择 “下一步”。

  5. 提供“声明规则名称”。 对于 属性存储区,请选择 Active Directory,添加以下声明。

    LDAP 属性 传出声明类型
    用户 -Principal-Name UPN
    姓氏
    Given-Name given_name
    Display-Name 姓名

    请注意,某些名称不会显示在传出声明类型下拉列表中。 需要手动键入它们(下拉列表是可编辑的)。

  6. 选择完成

  7. 选择 “应用”,然后选择 “确定”。

  8. 再次选择 “确定 ”以完成。

将 AD FS 配置为标识提供者

  1. 使用至少具有外部标识提供者管理员权限的帐户登录到 Azure 门户

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

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

  4. 选择“标识提供程序”,然后选择“新建 OpenID Connect 提供程序” 。

  5. 输入“名称”。 例如, Contoso

  6. 对于“元数据 URL”,请输入 AD FS OpenID Connect 配置文档的 URL。 例如:

    https://adfs.contoso.com/adfs/.well-known/openid-configuration 
    
  7. 对于 客户端 ID,请输入之前记录的应用程序 ID。

  8. 对于“范围”,请输入

  9. 对于 响应类型,请选择 id_token。 因此,不需要 客户端机密 值。 详细了解在添加通用 OpenID Connect 身份提供者时如何使用 客户端 ID 和密钥

  10. (可选)对于“域提示”,请输入 。 有关详细信息,请参阅使用 Azure Active Directory B2C 设置直接登录

  11. 在“标识提供者声明映射”下,选择以下声明:

    • 用户 IDupn
    • 显示名称unique_name
    • 给定名称given_name
    • 姓氏family_name
  12. 选择“保存”

将 AD FS 标识提供者添加到用户流

此时,AD FS (Contoso) 标识提供者已设置,但还不能在任何登录页中使用。 将 AD FS 标识提供者添加到用户流:

  1. 在 Azure AD B2C 租户中,选择“用户流” 。
  2. 选择要添加 AD FS 标识提供者(Contoso)的用户流。
  3. “社交标识提供者”下,选择 “Contoso”。
  4. 选择“保存”
  5. 若要测试策略,请选择“运行用户流”。
  6. 对于“应用程序”,请选择前面已注册的名为“testapp1”的 Web 应用程序。 “回复 URL”应显示为
  7. 选择“运行用户流”按钮。
  8. 在注册或登录页中,选择 Contoso 以使用 Contoso 帐户登录。

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

将 AD FS 配置为标识提供者

若要使用户能够使用 AD FS 帐户登录,需要将 AD FS 定义为声明提供程序,以便 Azure AD B2C 可以通过终结点与其通信。

  1. 打开 TrustFrameworkExtensions.xml

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

  3. 添加一个新的 ClaimsProvider,如下所示:

    <ClaimsProvider>
      <Domain>contoso.com</Domain>
      <DisplayName>Contoso</DisplayName>
      <TechnicalProfiles>
        <TechnicalProfile Id="Contoso-OpenIdConnect">
          <DisplayName>Contoso</DisplayName>
          <Protocol Name="OpenIdConnect" />
          <Metadata>
            <Item Key="METADATA">https://your-adfs-domain/adfs/.well-known/openid-configuration</Item>
            <Item Key="response_types">id_token</Item>
            <Item Key="response_mode">form_post</Item>
            <Item Key="scope">openid</Item>
            <Item Key="HttpBinding">POST</Item>
            <Item Key="UsePolicyInRedirectUri">0</Item>
            <!-- Update the Client ID below to the Application ID -->
            <Item Key="client_id">Your AD FS application ID</Item>
          </Metadata>
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="upn" />
            <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="given_name" />
            <OutputClaim ClaimTypeReferenceId="surname" PartnerClaimType="family_name" />
            <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="unique_name" />
            <OutputClaim ClaimTypeReferenceId="identityProvider" PartnerClaimType="iss"  />
            <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" AlwaysUseDefaultValue="true" />
          </OutputClaims>
          <OutputClaimsTransformations>
            <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName" />
            <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName" />
            <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId" />
          </OutputClaimsTransformations>
          <UseTechnicalProfileForSessionManagement ReferenceId="SM-SocialLogin" />
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider>
    
  4. 对于 元数据网址,请输入 AD FS OpenID Connect 配置文档的网址。 例如:

    https://adfs.contoso.com/adfs/.well-known/openid-configuration 
    
  5. 将client_id设置为应用程序注册中的应用程序 ID。

  6. 保存文件。

添加用户旅程

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

  1. 打开初学者包中的 TrustFrameworkBase.xml 文件。
  2. 找到并复制包含 Id="SignUpOrSignIn" 元素的完整内容。
  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="ContosoExchange" />
  </ClaimsProviderSelections>
  ...
</OrchestrationStep>

<OrchestrationStep Order="2" Type="ClaimsExchange">
  ...
  <ClaimsExchanges>
    <ClaimsExchange Id="ContosoExchange" TechnicalProfileReferenceId="Contoso-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)。

测试自定义策略

  1. 选择依赖方策略,例如 B2C_1A_signup_signin
  2. 对于应用程序,请选择您前面注册的 Web 应用程序。 “回复 URL”应显示为
  3. 选择“立即运行”按钮。
  4. 在注册或登录页中,选择 Contoso 以使用 Contoso 帐户登录。

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

后续步骤

了解如何将 AD-FS 令牌传递给应用程序