使用 Azure Active Directory B2C 设置通过通用 OpenID Connect 注册与登录

重要

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

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

OpenID Connect 是在 OAuth 2.0 之上构建的身份验证协议,可用于安全的用户登录。 Azure AD B2C 支持使用此协议的大多数标识提供者。

先决条件

添加标识提供者

  1. 使用至少具有外部标识提供者管理员权限的帐户登录到 Azure 门户
  2. 如果有权访问多个租户,请选择顶部菜单中的“设置”图标,从“目录 + 订阅”菜单切换到你的 Azure AD B2C 租户。
  3. 选择 Azure 门户左上角的“所有服务” ,搜索并选择 Azure AD B2C
  4. 选择“标识提供程序”,然后选择“新建 OpenID Connect 提供程序” 。
  5. 输入“名称”。 例如,输入 Contoso

通过在策略的扩展文件中将 OpenID Connect 标识提供者添加到 ClaimsProviders 元素来定义该标识提供者。

  1. 打开 TrustFrameworkExtensions.xml

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

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

    <ClaimsProvider>
      <Domain>contoso.com</Domain>
      <DisplayName>Login with Contoso</DisplayName>
      <TechnicalProfiles>
        <TechnicalProfile Id="Contoso-OpenIdConnect">
          <DisplayName>Contoso</DisplayName>
          <Description>Login with your Contoso account</Description>
          <Protocol Name="OpenIdConnect"/>
          <Metadata>
            <Item Key="METADATA">https://your-identity-provider.com/.well-known/openid-configuration</Item>
            <Item Key="client_id">00001111-aaaa-2222-bbbb-3333cccc4444</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>
          </Metadata>
          <!-- <CryptographicKeys>
            <Key Id="client_secret" StorageReferenceId="B2C_1A_ContosoSecret"/>
          </CryptographicKeys> -->
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="oid"/>
            <OutputClaim ClaimTypeReferenceId="tenantId" PartnerClaimType="tid"/>
            <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="given_name" />
            <OutputClaim ClaimTypeReferenceId="surName" PartnerClaimType="family_name" />
            <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" />
            <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" />
            <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" AlwaysUseDefaultValue="true" />
            <OutputClaim ClaimTypeReferenceId="identityProvider" PartnerClaimType="iss" />
            <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="oid"/>
          </OutputClaims>
          <OutputClaimsTransformations>
            <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName"/>
            <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName"/>
            <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId"/>
            <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromAlternativeSecurityId"/>
          </OutputClaimsTransformations>
          <UseTechnicalProfileForSessionManagement ReferenceId="SM-SocialLogin"/>
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider>
    

配置标识提供者

每个 OpenID Connect 标识提供者都描述了一个元数据文档,其中包含执行登录所需的大部分信息。 元数据文档包括要使用的 URL 和服务的公有签名密钥的位置等信息。 OpenID Connect 元数据文档始终位于 以 结尾的终结点。.well-known/openid-configuration 对于您要添加的 OpenID Connect 身份提供商,请输入其元数据 URL。

元数据 URL 中,输入 OpenID Connect 元数据文档的 URL。

<Item Key="METADATA"> 技术配置文件元数据中,输入 OpenID Connect 元数据文档的 URL。

客户端 ID 和密钥

为了允许用户登录,身份提供商要求开发人员在其服务中注册应用程序。 此应用程序具有一个称为 客户端 ID 的 ID 和一个 客户端密钥

客户端密钥是可选的。 但是,如果响应类型code,则必须提供客户端密钥,该密钥用于将代码交换为令牌。

要添加客户端 ID 和客户端密钥,请从身份提供商复制这些值,并将其输入到相应的字段中。

<Item Key="client_id"> 技术配置文件元数据中,输入客户端 ID。

创建策略密钥

如果需要客户端密码,请存储之前记录在 Azure AD B2C 租户中的客户端密码。

  1. 登录到 Azure 门户

  2. 确保正在使用的目录包含 Azure AD B2C 租户。 在门户工具栏中选择 Directory + subscription (目录 + 订阅 ) 筛选器。

  3. 在“门户设置 | 目录+订阅”页上的“目录名称”列表中找到你的 Azure AD B2C 目录,然后选择“切换”。

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

  5. 在“概述”页上选择“标识体验框架”。

  6. 选择“策略密钥”,然后选择“添加”

  7. 对于“选项”,选择 Manual

  8. 输入策略密钥的名称。 例如,ContosoSecret。 前缀 B2C_1A_ 会自动添加到密钥名称。

  9. “机密”中,输入之前记录的客户端密码。

  10. 在“密钥用法”处选择

  11. 单击 “创建”

  12. CryptographicKeys在 XML 元素中,添加以下元素:

    <CryptographicKeys>
      <Key Id="client_secret" StorageReferenceId="B2C_1A_ContosoSecret"/>
    </CryptographicKeys>
    

范围

范围 定义您希望从身份提供商处收集的信息和权限,例如 openid profile. 要从身份提供商接收 ID 令牌, openid 必须指定范围。

如果没有 ID 令牌,用户无法使用自定义标识提供者登录到 Azure AD B2C。 其他范围可以追加以空格分隔。 请参阅自定义身份提供商的文档,了解哪些其他范围可能可用。

在“作用域”中,输入标识提供者的作用域。 例如,openid profile

<Item Key="scope"> 技术配置文件元数据中,输入标识提供者的作用域。 例如,openid profile

响应类型

响应类型描述在对 authorization_endpoint 自定义身份提供商的初始调用中发送回的信息类型。 可以使用以下响应类型:

  • code:根据 授权代码流,代码将返回给 Azure AD B2C。 Azure AD B2C 将继续调用 token_endpoint,以交换令牌代码。
  • id_token:ID 令牌将从自定义标识提供者返回到 Azure AD B2C。

Response type (响应类型) 中,根据您的身份提供商设置选择 code, 或 id_token

<Item Key="response_types"> 技术配置文件元数据中,根据标识提供者设置选择 codeid_token

响应模式

响应模式定义用于将数据从自定义标识提供者发送回 Azure AD B2C 的方法。 可以使用以下响应模式:

  • form_post:建议使用此响应模式以获得最佳安全性。 响应通过 HTTP POST 方法传输,代码或令牌在正文中使用 application/x-www-form-urlencoded 格式编码。
  • query:代码或 Token 作为查询参数返回。

Response mode (响应模式) 中,根据您的身份提供商设置 选择 form_postquery

<Item Key="response_mode"> 技术配置文件元数据中,根据标识提供者设置选择 form_postquery

域名提示

域提示可用于直接跳至指定身份提供商的登录页面,而不是让用户在可用身份提供商列表中进行选择。

要允许此类行为,请输入 domain hint 的值。 若要跳转到自定义标识提供者,请在调用 Azure AD B2C 进行登录时将参数 domain_hint=<domain hint value> 追加到请求的末尾。

Domain hint (域提示) 中,输入域提示中使用的域名。

<Domain>contoso.com</Domain> 技术配置文件 XML 元素中,输入域提示中使用的域名。 例如,contoso.com

声明映射

自定义标识提供者将 ID 令牌发送回 Azure AD B2C 后,Azure AD B2C 需要能够将收到的令牌中的声明映射到 Azure AD B2C 识别和使用的声明。 对于以下每个映射,请参阅自定义标识提供者的文档,以了解标识提供者的令牌中返回的声明:

  • 用户 ID:输入为已登录用户提供 唯一标识符 的声明。
  • 显示名称:输入为用户提供 显示名称全名 的声明。
  • 名字:输入提供用户名字的声明。
  • 姓氏:输入提供用户 姓氏 的声明。
  • 电子邮件:输入提供用户 电子邮件地址 的声明。

OutputClaims 元素包含您的身份提供商返回的声明列表。 将您策略中定义的声明名称映射到身份提供商中定义的名称。 在 <OutputClaims> 元素下,使用标识提供者定义的相应声明名称配置 PartnerClaimType 属性。

索赔类型参考编号 合作伙伴索赔类型
issuerUserId 输入为已登录用户提供 唯一标识符 的声明。
displayName 输入为用户提供 显示名称全名 的声明。
givenName 输入提供用户的名字的声明。
surName 输入提供用户的姓氏的声明
email 输入提供用户 电子邮件地址 的声明。
identityProvider 输入提供令牌颁发者名称的声明。 例如,iss。 如果身份提供商未在令牌中包含发行者声明,请使用身份提供商的唯一标识符设置该属性DefaultValue。 例如,DefaultValue="contoso.com"

将身份提供商添加到用户流

  1. 在 Azure AD B2C 租户中,选择“用户流” 。
  2. 单击要添加标识提供者的用户流。
  3. Social identity providers(社交身份提供商)下,选择您添加的身份提供商。 例如, Contoso
  4. 选择“保存”

测试用户流

  1. 若要测试策略,请选择“运行用户流”。
  2. 对于“应用程序”,请选择前面已注册的名为“testapp1”的 Web 应用程序。 “回复 URL”应显示为
  3. 选择“运行用户流”按钮。
  4. 在注册或登录页面中,选择要登录的身份提供商。 例如, Contoso

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

添加用户旅程

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

  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 进行登录。

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

已知问题

  • Azure AD B2C 不支持使用 JWE (JSON Web 加密) 与 OpenID Connect 标识提供者交换加密令牌。

后续步骤

有关更多信息,请参阅 OpenId Connect 技术概况 参考指南。