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

为 Azure Active Directory B2C 配置 xID 以进行无密码身份验证

本教程介绍如何将 Azure Active Directory B2C (Azure AD B2C) 身份验证与 xID 数字 ID 解决方案集成。 xID 应用为用户提供无密码、安全、多重身份验证。 “我的编号卡”(由日本政府颁发的数字身份证)可验证经过 xID 身份验证的用户身份。 对于其用户,组织可以通过 xID API 获取经过验证的个人身份信息(客户内容)。 此外,xID 应用可在用户移动设备的安全区域中生成私钥,使其成为数字签名设备。

先决条件

  • Azure 订阅

  • 一个关联到 Azure 订阅的 Azure AD B2C 租户

  • xID inc 提供的 xID 客户端信息。

  • 请转到 xid.inc“联系我们”页以获取 xID 客户端信息:

    • 客户端 ID
    • 客户端机密
    • 重定向 URL
    • 作用域
  • 请转到 x-id.me,以在移动设备上安装 xID 应用

    • 我的编号卡
    • 如果使用 API UAT 版本,请获取 xID 应用 UAT 版本。 请参阅联系我们

方案描述

下图说明了此体系结构。

xID 体系结构示意图。

  1. 在 Azure AD B2C 登录页上,用户需要登录或注册。
  2. Azure AD B2C 使用 OpenID Connect (OIDC) 请求将用户重定向到 xID 授权 API 终结点。 OIDC 终结点包含终结点信息。 xID 标识提供者 (IdP) 会将用户重定向到 xID 授权登录页。 用户需要输入电子邮件地址。
  3. xID IdP 会将推送通知发送到用户移动设备上。
  4. 用户需要打开 xID 应用、检查请求、输入 PIN 或使用生物识别。 xID 应用将激活私钥并创建电子签名。
  5. xID 应用会将签名发送到 xID IdP 进行验证。
  6. 此时会显示一个同意屏幕,用于向服务提供个人信息。
  7. xID IdP 将 OAuth 授权代码返回给 Azure AD B2C。
  8. Azure AD B2C 使用授权代码发送令牌请求。
  9. xID IdP 将检查令牌请求。 如果有效,则系统会返回 OAuth 访问令牌以及包含用户标识符和电子邮件地址的 ID 令牌。
  10. 如果需要用户客户内容,则 Azure AD B2C 会调用 xID 用户数据 API。
  11. xID 用户数据 API 将返回加密的用户内容。 用户需要使用在请求 xID 客户端信息时创建的私钥进行解密。
  12. 系统将授权或拒绝用户访问客户应用程序。

安装 xID

  1. 若要请求 API 文档,请填写请求表。 请转到“联系我们”。
  2. 在消息中,指示你使用的是 Azure AD B2C。
  3. xID 销售代表将与你联系。
  4. 按照 xID API 文档中的说明进行操作。
  5. 请求 xID API 客户端。
  6. xID 技术团队会在 3-4 个工作日内将客户端信息发送给你。
  7. 使用以下模式在站点中提供重定向 URI。 经过身份验证后,用户将返回该 URI。

https://<your-b2c-domain>.b2clogin.com/<your-b2c-domain>.onmicrosoft.com/oauth2/authresp

在 Azure AD B2C 中注册 Web 应用程序

在你管理的租户中注册应用程序,然后它们可以与 Azure AD B2C 进行交互。

了解详细信息:可在 Active Directory B2C 中使用的应用程序类型

为了进行测试,需要注册 https://jwt.ms,这是一个包含已解码令牌内容的 Microsoft Web 应用程序,它不会离开你的浏览器。

注册 Web 应用程序并启用 ID 令牌隐式授权

请完成教程:在 Azure AD B2C 中注册 Web 应用程序

创建 xID 策略密钥

请将来自 xID 的客户端密码存储在你的 Azure AD B2C 租户中。 有关以下说明,请将目录与 Azure AD B2C 租户配合使用。

  1. 登录 Azure 门户
  2. 在门户工具栏中,选择“目录 + 订阅”。
  3. 在“门户设置 | 目录 + 订阅”页上的“目录名称”列表中,找到你的 Azure AD B2C 目录。
  4. 选择“切换”。
  5. 在 Azure 门户左上角,选择“所有服务”。
  6. 搜索并选择“Azure AD B2C”。
  7. 在“概述”上,选择“Identity Experience Framework”。
  8. 选择“策略密钥”。
  9. 选择 添加
  10. 对于“选项”,请选择“手动” 。
  11. 输入策略密钥的名称。 前缀 B2C_1A_ 会附加到密钥名称。
  12. 在“机密”中,输入来自 xID 的客户端密码。
  13. 对于“密钥用法”,请选择“签名” 。
  14. 选择“创建”。

注意

在 Azure AD B2C 中,自定义策略适用于复杂的场景。

请参阅用户流和自定义策略概述

将 xID 配置为标识提供者

为了让用户使用 xID 登录,请将 xID 定义为 Azure AD B2C 可通过终结点与其进行通信的声明提供程序。 终结点提供 Azure AD B2C 用于在其设备上使用数字标识验证用户身份的声明。

添加 xID 作为声明提供程序

从 GitHub 获取自定义策略新手包,然后使用 Azure AD B2C 租户名称更新 SocialAccounts 新手包中的 XML 文件。

  1. 下载 zip 文件 active-directory-b2c-policy-starterpack-main 或克隆存储库。 请参阅 Azure-Samples/active-directory-b2c-custom-policy-starterpack

  2. SocialAccounts 目录中的文件中,将字符串 yourtenant 替换为 Azure AD B2C 租户的名称。 例如,yourtenant.onmicrosoft.com 重命名为 contoso.onmicrosoft.com

  3. 打开 SocialAccounts/TrustFrameworkExtensions.xml

  4. 找到 ClaimsProviders 元素。 如果没有,请将其添加到根元素下。

  5. 添加新的 ClaimsProvider,它类似于以下示例:

    
     <ClaimsProvider>
       <Domain>X-ID</Domain>
       <DisplayName>X-ID</DisplayName>
       <TechnicalProfiles>
         <TechnicalProfile Id="X-ID-OIDC">
           <DisplayName>X-ID</DisplayName>
           <Description>Login with your X-ID account</Description>
           <Protocol Name="OpenIdConnect" />
           <Metadata>
             <Item Key="METADATA">https://oidc-uat.x-id.io/.well-known/openid-configuration</Item>
             <!-- Update the Client ID below to the X-ID Application ID -->
             <Item Key="client_id">00000000-0000-0000-0000-000000000000</Item>
             <Item Key="response_types">code</Item>
             <Item Key="scope">openid verification</Item>
             <Item Key="response_mode">query</Item>
             <Item Key="HttpBinding">POST</Item>
             <Item Key="UsePolicyInRedirectUri">false</Item>
             <Item Key="DiscoverMetadataByTokenIssuer">true</Item>
             <Item Key="token_endpoint_auth_method">client_secret_basic</Item>
             <Item Key="ClaimsEndpoint">https://oidc-uat.x-id.io/userinfo</Item>
             <Item Key="ValidTokenIssuerPrefixes">https://oidc-uat.x-id.io/</Item>
           </Metadata>
           <CryptographicKeys>
             <Key Id="client_secret" StorageReferenceId="B2C_1A_XIDSecAppSecret" />
           </CryptographicKeys>
           <OutputClaims>
             <OutputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="sub" />
             <OutputClaim ClaimTypeReferenceId="tenantId" PartnerClaimType="tid" />
             <OutputClaim ClaimTypeReferenceId="email" />
             <OutputClaim ClaimTypeReferenceId="sid" />
             <OutputClaim ClaimTypeReferenceId="userdataid" />
             <OutputClaim ClaimTypeReferenceId="XID_verified" />
             <OutputClaim ClaimTypeReferenceId="email_verified" />
             <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" AlwaysUseDefaultValue="true" />
             <OutputClaim ClaimTypeReferenceId="identityProvider" PartnerClaimType="iss" DefaultValue="https://oidc-uat.x-id.io/" />
             <OutputClaim ClaimTypeReferenceId="identityProviderAccessToken" PartnerClaimType="{oauth2:access_token}" />
           </OutputClaims>
           <OutputClaimsTransformations>
             <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName" />
             <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName" />
             <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId" />
             <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromAlternativeSecurityId" />
           </OutputClaimsTransformations>
           <UseTechnicalProfileForSessionManagement ReferenceId="SM-SocialLogin" />
         </TechnicalProfile>
    
       <TechnicalProfile Id="X-ID-Userdata">
         <DisplayName>Userdata (Personal Information)</DisplayName>
         <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
         <Metadata>
           <Item Key="ServiceUrl">https://api-uat.x-id.io/v4/verification/userdata</Item>
           <Item Key="SendClaimsIn">Header</Item>
           <Item Key="AuthenticationType">Bearer</Item>
           <Item Key="UseClaimAsBearerToken">identityProviderAccessToken</Item>
           <!-- <Item Key="AllowInsecureAuthInProduction">true</Item> -->
           <Item Key="DebugMode">true</Item>
           <Item Key="DefaultUserMessageIfRequestFailed">Can't process your request right now, please try again later.</Item>
         </Metadata>
         <InputClaims>
           <!-- Claims sent to your REST API -->
           <InputClaim ClaimTypeReferenceId="identityProviderAccessToken" />
         </InputClaims>
         <OutputClaims>
           <!-- Claims parsed from your REST API -->
           <OutputClaim ClaimTypeReferenceId="last_name" />
           <OutputClaim ClaimTypeReferenceId="first_name" />
           <OutputClaim ClaimTypeReferenceId="previous_name" />
           <OutputClaim ClaimTypeReferenceId="year" />
           <OutputClaim ClaimTypeReferenceId="month" />
           <OutputClaim ClaimTypeReferenceId="date" />
           <OutputClaim ClaimTypeReferenceId="prefecture" />
           <OutputClaim ClaimTypeReferenceId="city" />
           <OutputClaim ClaimTypeReferenceId="address" />
           <OutputClaim ClaimTypeReferenceId="sub_char_common_name" />
           <OutputClaim ClaimTypeReferenceId="sub_char_previous_name" />
           <OutputClaim ClaimTypeReferenceId="sub_char_address" />
           <OutputClaim ClaimTypeReferenceId="gender" />
           <OutputClaim ClaimTypeReferenceId="verified_at" />
         </OutputClaims>
         <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
       </TechnicalProfile>
     </TechnicalProfiles>
     </ClaimsProvider>
    
    
  6. 将 client_id 设置为你的 xID 应用程序 ID。

  7. 选择“保存”。

添加用户旅程

将标识提供者添加到登录页。

  1. 如果已有自定义用户旅程,请转到将标识提供者添加到用户旅程。 否则,请创建模板用户旅程的副本:
  2. 在初学者包中,打开 TrustFrameworkBase.xml
  3. 找到并复制包含 ID=SignUpOrSignInUserJourneys 元素的内容。
  4. 打开 TrustFrameworkExtensions.xml 并找到 UserJourneys 元素。 如果没有,请添加一个。
  5. 将 UserJourney 元素的内容粘贴为 UserJourneys 元素的子项。
  6. 重命名用户旅程 ID。 例如: ID=CustomSignUpSignIn

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

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

  1. 在用户旅程中,找到包含 Type=CombinedSignInAndSignUp 或 Type=ClaimsProviderSelection 的业务流程步骤元素。 这通常是第一个业务流程步骤。 ClaimsProviderSelections 元素具有用于登录的标识提供者列表。 元素顺序控制了登录按钮的顺序。
  2. 添加 ClaimsProviderSelection XML 元素。
  3. 将 TargetClaimsExchangeId 的值设置为易记名称。
  4. 添加 ClaimsExchange 元素。
  5. ID 设为目标声明交换 ID 的值。 此更改会将 xID 按钮链接到 X-IDExchange 操作。
  6. TechnicalProfileReferenceId 值更新为创建的技术配置文件 ID (X-ID-OIDC)。
  7. 添加业务流程步骤以调用 xID UserInfo 终结点,从而返回有关经过身份验证的用户 X-ID-Userdata 的声明。

以下 XML 演示了使用 xID 标识提供者的用户旅程业务流程。


 <UserJourney Id="CombinedSignInAndSignUp">
   <OrchestrationSteps>

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

     <OrchestrationStep Order="2" Type="ClaimsExchange">
       <ClaimsExchanges>
         <ClaimsExchange Id="X-IDExchange" TechnicalProfileReferenceId="X-ID-OIDC" />
       </ClaimsExchanges>
     </OrchestrationStep>

     <OrchestrationStep Order="3" Type="ClaimsExchange">
       <ClaimsExchanges>
         <ClaimsExchange Id="X-ID-Userdata" TechnicalProfileReferenceId="X-ID-Userdata" />
       </ClaimsExchanges>
     </OrchestrationStep>

     <!-- For social IDP authentication, attempt to find the user account in the directory. -->
     <OrchestrationStep Order="4" Type="ClaimsExchange">
       <ClaimsExchanges>
         <ClaimsExchange Id="AADUserReadUsingAlternativeSecurityId" TechnicalProfileReferenceId="AAD-UserReadUsingAlternativeSecurityId-NoError" />
       </ClaimsExchanges>
     </OrchestrationStep>

     <!-- Show self-asserted page only if the directory does not have the user account already (i.e. we do not have an objectId).  -->
     <OrchestrationStep Order="5" Type="ClaimsExchange">
       <Preconditions>
         <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
           <Value>objectId</Value>
           <Action>SkipThisOrchestrationStep</Action>
         </Precondition>
       </Preconditions>
       <ClaimsExchanges>
         <ClaimsExchange Id="SelfAsserted-Social" TechnicalProfileReferenceId="SelfAsserted-Social" />
       </ClaimsExchanges>
     </OrchestrationStep>

     <!-- The previous step (SelfAsserted-Social) could have been skipped if there were no attributes to collect 
          from the user. So, in that case, create the user in the directory if one does not already exist 
          (verified using objectId which would be set from the last step if account was created in the directory. -->
     <OrchestrationStep Order="6" Type="ClaimsExchange">
       <Preconditions>
         <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
           <Value>objectId</Value>
           <Action>SkipThisOrchestrationStep</Action>
         </Precondition>
       </Preconditions>
       <ClaimsExchanges>
         <ClaimsExchange Id="AADUserWrite" TechnicalProfileReferenceId="AAD-UserWriteUsingAlternativeSecurityId" />
       </ClaimsExchanges>
     </OrchestrationStep>

     <OrchestrationStep Order="7" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />

   </OrchestrationSteps>
   <ClientDefinition ReferenceId="DefaultWeb" />
 </UserJourney>

存在 xID 支持的标识声明,它们作为策略的一部分进行引用。 声明架构是发出声明的位置。 ClaimsSchema 元素具有 ClaimType 元素列表。 ClaimType 元素包含 ID 属性,它是声明名称。

  1. 打开 TrustFrameworksExtension.xml
  2. 找到 BuildingBlocks 元素。
  3. 将以下 ClaimType 元素添加到 TrustFrameworksExtension.xml 策略的 ClaimsSchema 元素中
 <BuildingBlocks>
    <ClaimsSchema>
      <!-- xID -->
      <ClaimType Id="sid">
        <DisplayName>sid</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      <ClaimType Id="userdataid">
        <DisplayName>userdataid</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      <ClaimType Id="xid_verified">
        <DisplayName>xid_verified</DisplayName>
        <DataType>boolean</DataType>
      </ClaimType>
      <ClaimType Id="email_verified">
        <DisplayName>email_verified</DisplayName>
        <DataType>boolean</DataType>
      </ClaimType>
      <ClaimType Id="identityProviderAccessToken">
        <DisplayName>Identity Provider Access Token</DisplayName>
        <DataType>string</DataType>
        <AdminHelpText>Stores the access token of the identity provider.</AdminHelpText>
      </ClaimType>
      <ClaimType Id="last_name">
        <DisplayName>last_name</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      <ClaimType Id="first_name">
        <DisplayName>first_name</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      <ClaimType Id="previous_name">
        <DisplayName>previous_name</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      <ClaimType Id="year">
        <DisplayName>year</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      <ClaimType Id="month">
        <DisplayName>month</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      <ClaimType Id="date">
        <DisplayName>date</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      <ClaimType Id="prefecture">
        <DisplayName>prefecture</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      <ClaimType Id="city">
        <DisplayName>city</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      <ClaimType Id="address">
        <DisplayName>address</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      <ClaimType Id="sub_char_common_name">
        <DisplayName>sub_char_common_name</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      <ClaimType Id="sub_char_previous_name">
        <DisplayName>sub_char_previous_name</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      <ClaimType Id="sub_char_address">
        <DisplayName>sub_char_address</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      <ClaimType Id="verified_at">
        <DisplayName>verified_at</DisplayName>
        <DataType>int</DataType>
      </ClaimType>
      <ClaimType Id="gender">
        <DisplayName>Gender</DisplayName>
        <DataType>string</DataType>
        <DefaultPartnerClaimTypes>
          <Protocol Name="OpenIdConnect" PartnerClaimType="gender" />
        </DefaultPartnerClaimTypes>
        <AdminHelpText>The user's gender.</AdminHelpText>
        <UserHelpText>Your gender.</UserHelpText>
        <UserInputType>TextBox</UserInputType>
      </ClaimType>
      <ClaimType Id="correlationId">
        <DisplayName>correlation ID</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      <!-- xID -->
    </ClaimsSchema>
  </BuildingBlocks>

配置信赖方策略

信赖方策略(例如 SignUpSignIn.xml)指定 Azure AD B2C 执行的用户旅程。

  1. 在信赖方中,找到 DefaultUserJourney 元素。
  2. 更新 ReferenceId,以与已在其中添加标识提供者的用户旅程 ID 匹配。

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

   <RelyingParty>
        <DefaultUserJourney ReferenceId="CombinedSignInAndSignUp" />
        <TechnicalProfile Id="PolicyProfile">
          <DisplayName>PolicyProfile</DisplayName>
          <Protocol Name="OpenIdConnect" />
          <OutputClaims>
          <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub" />
          <OutputClaim ClaimTypeReferenceId="tenantId" AlwaysUseDefaultValue="true" DefaultValue="{Policy:TenantObjectId}" />
          <OutputClaim ClaimTypeReferenceId="correlationId" DefaultValue="{Context:CorrelationId}" />
          <OutputClaim ClaimTypeReferenceId="issuerUserId" />
          <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="first_name" />
          <OutputClaim ClaimTypeReferenceId="surName" PartnerClaimType="last_name" />
          <OutputClaim ClaimTypeReferenceId="previous_name" />
          <OutputClaim ClaimTypeReferenceId="year" />
          <OutputClaim ClaimTypeReferenceId="month" />
          <OutputClaim ClaimTypeReferenceId="date" />
          <OutputClaim ClaimTypeReferenceId="prefecture" />
          <OutputClaim ClaimTypeReferenceId="city" />
          <OutputClaim ClaimTypeReferenceId="address" />
          <OutputClaim ClaimTypeReferenceId="sub_char_common_name" />
          <OutputClaim ClaimTypeReferenceId="sub_char_previous_name" />
          <OutputClaim ClaimTypeReferenceId="sub_char_address" />
          <OutputClaim ClaimTypeReferenceId="gender" />
          <OutputClaim ClaimTypeReferenceId="verified_at" />
          <OutputClaim ClaimTypeReferenceId="email" />
          <OutputClaim ClaimTypeReferenceId="sid" />
          <OutputClaim ClaimTypeReferenceId="userdataid" />
          <OutputClaim ClaimTypeReferenceId="xid_verified" />
          <OutputClaim ClaimTypeReferenceId="email_verified" />
          </OutputClaims>
          <SubjectNamingInfo ClaimType="sub" />
        </TechnicalProfile>
      </RelyingParty>

上传自定义策略

有关以下说明,请将目录与 Azure AD B2C 租户配合使用。

  1. 登录 Azure 门户
  2. 在门户工具栏中,选择“目录 + 订阅”。
  3. 在“门户设置 | 目录 + 订阅”页上的“目录名称”列表中, 找到你的 Azure AD B2C 目录。
  4. 选择“切换”。
  5. Azure 门户中,搜索并选择 Azure AD B2C。
  6. 在策略下,选择 Identity Experience Framework。
  7. 选择“上传自定义策略”。
  8. 按以下顺序上传文件:
  • 基本策略文件:TrustFrameworkBase.xml
  • 扩展策略:TrustFrameworkExtensions.xml
  • 信赖方策略:SignUpSignIn.xml

测试自定义策略

  1. 在 Azure AD B2C 租户中的“策略”下选择“Identity Experience Framework”。
  2. 在“自定义策略”下,选择“CustomSignUpSignIn”。
  3. 对于“应用程序”,请选择你注册的 Web 应用程序回复 URLhttps://jwt.ms
  4. 选择“立即运行”。
  5. 浏览器将重定向到 xID 登录页。
  6. 浏览器重定向到 https://jwt.ms。 将显示 Azure AD B2C 返回的令牌内容。

后续步骤