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

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

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

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

本文介绍如何将自定义 OpenID Connect 标识提供者添加到用户流。

重要

终结点必须符合 Azure AD B2C 安全要求。 较旧的 TLS 版本和密码已弃用。 有关详细信息,请参阅 Azure AD B2C TLS 和密码套件要求

先决条件

添加标识提供者

  1. 以 Azure AD B2C 租户的全局管理员身份登录 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">00000000-0000-0000-0000-000000000000</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 租户的目录。 在门户工具栏中选择“目录 + 订阅”筛选器。

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

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

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

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

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

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

  9. 在“机密”中,输入前面记录的应用程序机密。

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

  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。

在“响应类型”中,根据标识提供者设置选择 codeid_token

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

响应模式

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

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

在“响应模式”中,根据标识提供者设置选择 form_postquery

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

域提示

域提示可用于直接跳转到指定标识提供者的登录页面,用户无需在可用标识提供者列表中进行选择。

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

在“域提示”中,输入域提示中使用的域名。

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

声明映射

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

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

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

ClaimTypeReferenceId PartnerClaimType
issuerUserId 输入提供已登录用户唯一标识符的声明。
displayName 输入提供用户的显示名或全名的声明。
givenName 输入提供用户的名字的声明。
surName 输入提供用户的姓氏的声明。
email 输入提供用户的电子邮件地址的声明。
identityProvider 输入提供令牌颁发者名称的声明。 例如,iss。 如果标识提供者不在令牌中包含颁发者声明,请使用标识提供者的唯一标识符来设置 DefaultValue 属性。 例如,DefaultValue="contoso.com"

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

  1. 在 Azure AD B2C 租户中,选择“用户流” 。
  2. 单击要添加标识提供者的用户流。
  3. 在“社交标识提供者”下,选择已添加的标识提供者。 例如,Contoso。
  4. 选择“保存”。

测试用户流

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

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

添加用户旅程

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

  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”以使用 Google 帐户登录。

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

已知问题

  • Azure AD B2C 不支持 JWE (JSON Web 加密) 与 OpenID 连接标识提供方交换加密令牌。

后续步骤

有关详细信息,请参阅 OpenID Connect 技术配置文件参考指南。