使用 Azure Active Directory B2C 设置通过 Apple ID 进行的注册与登录

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

注意

在 Azure Active Directory B2C 中,自定义策略主要用于解决复杂的情况。 在大多数情况下,建议你使用内置用户流。 如果尚未这样做,请从 Active Directory B2C 中的自定义策略入门了解自定义策略新手包。

必备条件

创建 Apple ID 应用程序

若要在 Azure Active Directory B2C (Azure AD B2C) 中为用户启用使用 Apple ID 登录的功能,需要在 https://developer.apple.com 中创建应用程序。 有关详细信息,请参阅使用 Apple 登录。 如果你还没有 Apple 开发者帐户,可在 Apple 开发者计划上注册一个。

  1. 使用帐户凭据登录 Apple 开发者门户
  2. 从菜单中,选择“证书、ID 和配置文件”,然后选择“(+)”
  3. 对于“注册新标识符”,选择“应用 ID”,然后选择“继续”。
  4. 对于“选择类型”,选择“应用”,然后选择“继续”。
  5. 对于“注册应用 ID”
    1. 输入“说明”
    2. 输入“捆绑包 ID”,如 com.contoso.azure-ad-b2c
    3. 对于“功能”,从功能列表中选择“通过 Apple 登录”。
    4. 记下这一步当中的团队 ID(应用 ID 前缀)。 稍后需要用到此信息。
    5. 选择“继续” ,然后选择“注册” 。
  6. 从菜单中,选择“证书、ID 和配置文件”,然后选择“(+)”
  7. 对于“注册新标识符”,选择“服务 ID”,然后选择“继续”。
  8. 对于“注册服务 ID”
    1. 输入“说明”。 说明内容将在同意屏幕上显示给用户。
    2. 输入“标识符”,如 com.consoto.azure-ad-b2c-service。 记下服务 ID 标识符。 标识符是 OpenID Connect 流的客户端 ID。
    3. 选择“继续”,然后选择“注册”。
  9. 从“标识符”中选择你创建的标识符。
  10. 选择“通过 Apple 登录”,然后选择“配置”。
    1. 选择配置“通过 Apple 登录”所用的“主应用 ID”。
    2. 在“域和子域”中,输入 your-tenant-name.b2clogin.cn。 将 your-tenant-name 替换为租户的名称。
    3. 在“返回 URL”中,输入 https://your-tenant-name.b2clogin.cn/your-tenant-name.partner.onmschina.cn/oauth2/authresp。 将 your-tenant-name 替换为租户的名称。 回调 URL 需采用全小写形式。
    4. 选择“下一步”,然后选择“完成”。
    5. 当弹出窗口关闭时,选择“继续”,然后选择“保存”。

创建 Apple 客户端密码

  1. 在 Apple 开发者门户菜单中,选择“密钥”,然后选择“(+)”。
  2. 对于“注册新密钥”
    1. 键入“密钥名称”。
    2. 选择“通过 Apple 登录”,然后选择“配置”。
    3. 对于“主应用 ID”,选择先前创建的应用,然后选择“保存”。
    4. 选择“配置”,然后选择“注册”以完成密钥注册过程。 记下密钥 ID。 配置用户流时需要此密钥。
  3. 对于“下载密钥”,选择“下载”以下载包含密钥的 .p8 文件。

签署客户端密码

使用以前下载的 .p8 文件将客户端密码签署到 JWT 令牌。 可使用许多库来创建 JWT 并对其进行签名。 使用 Azure 函数为你创建令牌。

  1. 创建 Azure 函数

  2. 在“开发人员”下,选择“代码和测试”。

  3. 复制 run.csx 文件的内容,并将其粘贴到编辑器中。

  4. 选择“保存”。

  5. 发出 HTTP POST 请求,并提供以下信息:

    • appleTeamId:你的 Apple 开发者团队 ID
    • appleServiceId:Apple 服务 ID(客户端 ID)
    • appleKeyId:存储在 JWT 标头中的 10 位密钥 ID(Apple 要求)
    • p8key:PEM 格式密钥。 获取此密钥的方式如下:在文本编辑器中打开 .p8 文件,复制 -----BEGIN PRIVATE KEY----------END PRIVATE KEY----- 之间的所有内容(无换行符)。

以下 JSON 是调用 Azure 函数的一个示例:

{
    "appleTeamId": "ABC123DEFG",
    "appleServiceId": "com.yourcompany.app1",
    "appleKeyId": "URKEYID001",
    "p8key": "MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQg+s07NiAcuGEu8rxsJBG7ttupF6FRe3bXdHxEipuyK82gCgYIKoZIzj0DAQehRANCAAQnR1W/KbbaihTQayXH3tuAXA8Aei7u7Ij5OdRy6clOgBeRBPy1miObKYVx3ki1msjjG2uGqRbrc1LvjLHINWRD"
}

Azure 函数在响应中使用格式正确且已签名的客户端密码 JWT 做出响应,例如:

{
    "token": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjb20ueW91cmNvbXBhbnkuYXBwMSIsIm5iZiI6MTU2MDI2OTY3NSwiZXhwIjoxNTYwMzU2MDc1LCJpc3MiOiJBQkMxMjNERUZHIiwiYXVkIjoiaHR0cHM6Ly9hcHBsZWlkLmFwcGxlLmNvbSJ9.Dt9qA9NmJ_mk6tOqbsuTmfBrQLFqc9BnSVKR6A-bf9TcTft2XmhWaVODr7Q9w1PP3QOYShFXAnNql5OdNebB4g"
}

创建策略密钥

你需要存储前面在 Azure AD B2C 租户中记录的客户端机密。

  1. 登录 Azure 门户
  2. 如果有权访问多个租户,请选择顶部菜单中的“设置”图标,从“目录 + 订阅”菜单切换到你的 Azure AD B2C 租户。
  3. 在“Azure 服务”下,选择“Azure AD B2C”。 或者,使用搜索框查找并选择“Azure AD B2C”。
  4. 在“概述”页上,选择“Identity Experience Framework”。
  5. 选择“策略密钥”,然后选择“添加” 。
  6. 对于“选项”,选择“手动”。
  7. 输入策略密钥的名称。 例如,“AppleSecret”。 前缀“B2C_1A_”会自动添加到密钥名称中。
  8. 在“密钥”中,输入 Azure 函数返回的令牌值(JWT 令牌)。
  9. 对于“密钥用法”,请选择“签名” 。
  10. 选择“创建”。

重要

  • 通过 Apple 登录要求管理员每 6 个月更新一次其客户端密码。
  • 如果 Apple 客户端密码过期,需要手动更新密码,并将新值存储在策略密钥中。
  • 建议在 6 个月内自行设置提醒以生成新的客户端密码。
  • 遵循指南,了解如何提供“使用 Apple ID 登录”按钮

将 Apple 配置为标识提供程序

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

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

  1. 打开 TrustFrameworkExtensions.xml

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

  3. 如下所示添加新的 ClaimsProvider

    <ClaimsProvider>
      <Domain>apple.com</Domain>
      <DisplayName>Apple</DisplayName>
      <TechnicalProfiles>
        <TechnicalProfile Id="Apple-OIDC">
          <DisplayName>Sign in with Apple</DisplayName>
          <Protocol Name="OpenIdConnect" />
          <Metadata>
            <Item Key="ProviderName">apple</Item>
            <Item Key="authorization_endpoint">https://appleid.apple.com/auth/authorize</Item>
            <Item Key="AccessTokenEndpoint">https://appleid.apple.com/auth/token</Item>
            <Item Key="JWKS">https://appleid.apple.com/auth/keys</Item>
            <Item Key="issuer">https://appleid.apple.com</Item>
            <Item Key="scope">name email openid</Item>
            <Item Key="HttpBinding">POST</Item>
            <Item Key="response_types">code</Item>
            <Item Key="external_user_identity_claim_id">sub</Item>
            <Item Key="response_mode">form_post</Item>
            <Item Key="ReadBodyClaimsOnIdpRedirect">user.name.firstName user.name.lastName user.email</Item>
            <Item Key="client_id">You Apple ID</Item>
            <Item Key="UsePolicyInRedirectUri">false</Item>
          </Metadata>
          <CryptographicKeys>
            <Key Id="client_secret" StorageReferenceId="B2C_1A_AppleSecret"/>
          </CryptographicKeys>
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="sub" />
            <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="https://appleid.apple.com" AlwaysUseDefaultValue="true" />
            <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" AlwaysUseDefaultValue="true" />
            <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="user.name.firstName"/>
            <OutputClaim ClaimTypeReferenceId="surname" PartnerClaimType="user.name.lastName"/>
            <OutputClaim ClaimTypeReferenceId="email" />
          </OutputClaims>
          <OutputClaimsTransformations>
            <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName"/>
            <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName"/>
            <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId"/>
            <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromAlternativeSecurityId"/>
          </OutputClaimsTransformations>
          <UseTechnicalProfileForSessionManagement ReferenceId="SM-SocialLogin" />
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider>
    
  4. 将 client_id 设置为服务标识符。 例如,com.consoto.azure-ad-b2c-service

  5. 保存文件。

添加用户旅程

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

  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="AppleExchange" />
  </ClaimsProviderSelections>
  ...
</OrchestrationStep>

<OrchestrationStep Order="2" Type="ClaimsExchange">
  ...
  <ClaimsExchanges>
    <ClaimsExchange Id="AppleExchange" TechnicalProfileReferenceId="Apple-OIDC" />
  </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. 在注册或登录页上,选择“Apple”以使用 Apple ID 登录。

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

自定义用户界面

遵循指南,了解如何提供“使用 Apple ID 登录”。 Apple 提供几个“使用 Apple ID 登录”按钮,你可以使用这些按钮让用户设置帐户并登录。 如有必要,可以创建自定义按钮来提供“使用 Apple ID 登录”选项。 了解如何显示“使用 Apple ID 登录”按钮

与 Apple 用户界面准则一致: