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

开始之前,请使用此页顶部的“选择策略类型”选择器来选择要设置的策略类型。 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. 在“客户端-服务器应用程序”下,选择“访问 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 应用程序” 。 然后选择“编辑”。 Screenshot that shows how to edit a web application.

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

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

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

    LDAP 属性 传出声明类型
    User-Principal-Name upn
    Surname family_name
    Given-Name given_name
    Display-Name name

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

  6. 选择“完成”。

  7. 依次选择“应用”、“确定” 。

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

将 AD FS 配置为标识提供者

  1. 以 Azure AD B2C 租户的全局管理员身份登录 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. 对于“范围”,请输入 openid

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

  10. (可选)对于“域提示”,请输入 contoso.com。 有关详细信息,请参阅使用 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”应显示为 https://jwt.ms
  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. 对于“元数据 URL”,请输入 AD FS OpenID Connect 配置文档的 URL。 例如:

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

  6. 保存文件。

添加用户旅程

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

  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="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),然后上传信赖方策略(例如 SignUpSignIn.xml)。

测试自定义策略

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

如果登录过程是成功的,则你的浏览器会被重定向到 https://jwt.ms,其中显示 Azure AD B2C 返回的令牌内容。

后续步骤

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