在 Azure Active Directory B2C 中管理用户访问权限

重要

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

本文介绍如何使用 Azure Active Directory B2C(Azure AD B2C)管理对应用程序的用户访问权限。 应用程序中的访问管理包括:

  • 识别未成年人并控制用户对应用程序的访问。
  • 要求未成年人在使用应用程序之前经过家长的同意。
  • 从用户收集出生和国家/地区数据。
  • 获取使用条款协议并设置访问限制。

备注

在 Azure Active Directory B2C 中,自定义策略 主要用于解决复杂场景。 对于大多数场景,我们建议您使用内置的用户流。 如果未这样做,请通过 Active Directory B2C 中的自定义策略入门来了解自定义策略初学者包。

控制未成年人访问

应用程序和组织可能会决定阻止未成年人使用不面向此受众的应用程序和服务。 或者,应用程序和组织可以决定接受未成年人,并随后管理家长同意,并按照业务规则和法规允许为未成年人提供允许的体验。

如果用户标识为次要用户,可以将 Azure AD B2C 中的用户流设置为以下三个选项之一:

  • 将签名的 JWT id_token发送回应用程序:用户在目录中注册,令牌将返回到应用程序。 然后,应用程序通过应用业务规则继续进行。 例如,应用程序可能会继续执行家长同意过程。 若要使用此方法,请选择从应用程序接收 ageGroupconsentProvidedForMinor 声明。

  • 将未签名的 JSON 令牌发送到应用程序:Azure AD B2C 通知应用程序用户是未成年人,并提供用户家长同意的状态。 然后,应用程序通过应用业务规则继续进行。 JSON 令牌无法在应用程序中成功完成身份验证。 应用程序必须根据 JSON 令牌中包含的声明处理未经身份验证的用户,这些声明可能包括 名称电子邮件ageGroupconsentProvidedForMinor

  • 阻止用户:如果用户是未成年人,并且未提供家长同意,Azure AD B2C 可以通知用户他们被阻止。 未颁发令牌、阻止访问,并且不会在注册过程中创建用户帐户。 若要实现此通知,请提供合适的 HTML/CSS 内容页,以通知用户并显示适当的选项。 应用程序无需采取进一步作即可进行新注册。

根据应用程序法规,家长同意可能需要由作为成人验证的用户授予。 Azure AD B2C 不提供验证个人年龄的体验,然后允许经过验证的成年人向未成年人授予家长同意。 此体验必须由应用程序或其他服务提供商提供。

下面是用于收集家长同意的用户流示例:

  1. Microsoft Graph API操作将用户标识为未成年人,并以未签名的 JSON 令牌形式将用户数据返回给应用程序。

  2. 应用程序处理 JSON 令牌并向未成年人显示屏幕,通知他们家长同意是必需的,并在线请求家长同意。

  3. Azure AD B2C 显示用户可正常登录的登录旅程,并向应用程序颁发一个设为包含 legalAgeGroupClassification ="minorWithParentalConsent" 的令牌。 应用程序收集父母的电子邮件地址,并验证父母是成年人。 为此,它使用受信任的源,例如国家/地区 ID 办公室、许可证验证或信用卡证明。 如果验证成功,应用程序会提示未成年人使用 Azure AD B2C 用户流登录。 如果同意被拒绝(例如,如果 legalAgeGroupClassification = “minorWithoutParentalConsent”),Azure AD B2C 将 JSON 令牌(而不是登录名)返回到应用程序以重启许可过程。 可以选择自定义用户流,以便未成年人或成年人可以通过将注册代码发送到未成年人的电子邮件地址或记录中的成人电子邮件地址来重新获得对未成年人帐户的访问权限。

  4. 应用程序向未成年人提供撤销同意的选项。

  5. 当未成年人或成年人撤销同意时,可使用 Microsoft Graph API 将 consentProvidedForMinor 更改为 拒绝。 或者,应用程序可以选择删除已撤销其同意的未成年人。 可以选择对用户流进行自定义,以便经过身份验证的未成年人(或使用未成年人帐户的父母)可以撤销同意。 Azure AD B2C 将 consentProvidedForMinor 记录为 被拒绝

有关 legalAgeGroupClassificationconsentProvidedForMinorageGroup 的详细信息,请参阅 用户资源类型。 有关自定义属性的详细信息,请参阅 使用自定义属性收集有关使用者的信息。 使用 Microsoft 图形 API 解决扩展属性时,必须使用属性的长版本,例如 extension_18b70cf9bb834edd8f38521c2583cd86_dateOfBirth2011-01-01T00:00:00Z

收集出生日期和国家/地区数据

应用程序可能依赖 Azure AD B2C 从注册期间收集所有用户的出生日期(DOB)和国家/地区信息。 如果此信息尚不存在,应用程序可以在下一次身份验证(登录)旅程中从用户请求它。 用户无法在没有提供出生日期和国家/地区信息的情况下继续操作。 Azure AD B2C 使用信息来确定个人是否根据国家/地区的法规标准将个人视为未成年人。

自定义的用户流可以收集 DOB 和国家/地区信息,并使用 Azure AD B2C 声明转换来确定 ageGroup 并在目录中保留结果(或直接保留 DOB 和国家/地区信息)。

以下步骤显示了用于从用户出生日期计算 ageGroup 的逻辑:

  1. 尝试按列表中的国家/地区代码查找国家/地区。 如果未找到国家/地区,请回退到 Default

  2. 如果 MinorConsent 节点存在于国家/地区元素中:

    a。 计算用户必须出生的日期才能被视为成人。 例如,如果当前日期为 2015 年 3 月 14 日,而 MinorConsent 为 18,则出生日期不得晚于 2000 年 3 月 14 日。

    b. 将最小出生日期与实际出生日期进行比较。 如果最小出生日期在用户的出生日期之前,则计算返回 Minor 作为年龄组计算。

  3. 如果 Country/region 元素中存在 MinorNoConsentRequired 节点,请使用 MinorNoConsentRequired 中的值重复步骤 2a 和 2b。 如果最小出生日期在用户的出生日期之前,则 2b 的输出将返回 MinorNoConsentRequired

  4. 如果任何计算都未返回 true,则计算会返回 Adult

如果应用程序通过其他方法可靠地收集了 DOB 或国家/地区数据,则应用程序可以使用图形 API 更新用户记录以及此信息。 例如:

  • 如果用户已知为成人,请使用值 Adult 更新目录属性 ageGroup
  • 如果用户已知是未成年人,请使用 Minor 值更新目录属性 ageGroup,并根据需要设置 consentProvidedForMinor

次要计算规则

年龄限制涉及两个年龄值:某人不再被视为未成年人的年龄,以及未成年人必须获得家长同意的年龄。 下表列出了用于定义未成年人和需要同意的未成年人的年龄规则。

国家/地区 国家/地区名称 未成年人同意年龄 未成年人年龄
违约 没有 没有 18
AE 阿拉伯联合酋长国 没有 21
奥地利 14 18
比利时 14 18
BG 保加利亚 16 18
BH 巴林 没有 21
厘米 喀麦隆 没有 21
CY 塞浦路斯 16 18
捷克 捷克共和国 16 18
德国 德国 16 18
DK 丹麦 16 18
EE 爱沙尼亚 16 18
EG 埃及 没有 21
ES(西班牙语) 西班牙 13 18
FR 法国 16 18
GB 英国 13 18
GR 希腊 16 18
人力资源 克罗地亚 16 18
匈牙利 16 18
Internet Explorer (IE) 爱尔兰 13 18
信息技术 意大利 16 18
KR 韩国 14 18
LT 立陶宛 16 18
卢森堡 16 18
路易威登 拉托维亚 16 18
MT 马耳他 16 18
暂无 纳米比亚 没有 21
荷兰 荷兰 16 18
波兰 波兰 13 18
葡萄牙 16 18
RO 罗马尼亚 16 18
瑞典 13 18
SG 新加坡 没有 21
国际单位制 斯洛文尼亚 16 18
SK 斯洛伐克 16 18
TD 乍得 没有 21
TH 泰国 没有 20
台湾 中国台湾 没有 20
美国 美国 13 18

捕获用户条款的同意状态

开发应用程序时,我们通常会从用户目录捕获用户在其应用程序中接受使用条款的情况,其中规定不允许或只允许未成年人参与应用程序。 但是,可以使用 Azure AD B2C 用户流来收集用户对使用条款的接受,如果未接受则限制访问,并在将来对使用条款进行更改时进行接受强制。这一过程将基于最新接受日期和使用条款最新版本的日期。

使用条款 可能包括“同意与第三方共享数据”。根据当地法规和业务规则,可以收集用户同时接受这两种条件的接受情况,也可以允许用户接受一个条件,而不是另一个条件。

以下步骤介绍如何管理使用条款:

  1. 使用图形 API 和扩展属性记录使用条款的接受和接受日期。 为此,可以使用内置用户流和自定义策略。 建议创建和使用 extension_termsOfUseConsentDateTimeextension_termsOfUseConsentVersion 属性。

  2. 创建标记为“接受使用条款”的必需复选框,并在注册过程中记录结果。 为此,可以使用内置用户流和自定义策略。

  3. Azure AD B2C 存储使用条款协议和用户的接受。 您可以使用 Graph API 通过读取用于记录响应的扩展属性(例如,读取 termsOfUseTestUpdateDateTime)来查询任何用户的状态。 为此,可以使用内置用户流和自定义策略。

  4. 通过将接受日期与最新版本使用条款的日期进行比较,要求接受更新的使用条款。 只能使用自定义用户流来比较日期。 使用扩展属性 extension_termsOfUseConsentDateTime,并将该值与 termsOfUseTextUpdateDateTime 的声明进行比较。 如果接受日期更早,则通过显示自我断言的屏幕来强制接受新条款。 否则,请使用策略逻辑阻止访问。

  5. 要求接受更新的使用条款,方法是将接受的版本号与最新的接受版本号进行比较。 只能使用自定义用户流来比较版本号。 使用扩展属性 extension_termsOfUseConsentDateTime,并将该值与 extension_termsOfUseConsentVersion声明进行比较。 如果接受日期更早,则通过显示自我断言的屏幕来强制接受新条款。 否则,请使用策略逻辑阻止访问。

可以在以下情况下记录接受使用条款:

  • 新用户正在注册。 将显示使用条款,并存储接受结果。
  • 用户登录之前已接受最新或有效的使用条款。 不会显示使用条款。
  • 尚未接受最新或正在执行的使用条款的用户正在登录。 将显示使用条款,并存储接受结果。
  • 用户正在登录,该用户已接受旧版使用条款,现已更新为最新版本。 将显示使用条款,并存储接受结果。

下图显示了建议的用户流:

显示建议接受用户流的流程图

下面是声明中基于日期的使用条款同意情况示例。 如果extension_termsOfUseConsentDateTime声明早于2025-01-15T00:00:00,请通过检查termsOfUseConsentRequired布尔声明并显示自我声明屏幕来强制新的接受。

<ClaimsTransformations>
  <ClaimsTransformation Id="GetNewUserAgreeToTermsOfUseConsentDateTime" TransformationMethod="GetCurrentDateTime">
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="extension_termsOfUseConsentDateTime" TransformationClaimType="currentDateTime" />
    </OutputClaims>
  </ClaimsTransformation>
  <ClaimsTransformation Id="IsTermsOfUseConsentRequired" TransformationMethod="IsTermsOfUseConsentRequired">
    <InputClaims>
      <InputClaim ClaimTypeReferenceId="extension_termsOfUseConsentDateTime" TransformationClaimType="termsOfUseConsentDateTime" />
    </InputClaims>
    <InputParameters>
      <InputParameter Id="termsOfUseTextUpdateDateTime" DataType="dateTime" Value="2025-01-15T00:00:00" />
    </InputParameters>
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="termsOfUseConsentRequired" TransformationClaimType="result" />
    </OutputClaims>
  </ClaimsTransformation>
</ClaimsTransformations>

下面是声明中基于版本的使用条款同意情况示例。 如果 extension_termsOfUseConsentVersion 声明不等于 V1,请通过检查 termsOfUseConsentRequired 布尔声明并显示一个自断言屏幕来强制重新接受声明。

<ClaimsTransformations>
  <ClaimsTransformation Id="GetEmptyTermsOfUseConsentVersionForNewUser" TransformationMethod="CreateStringClaim">
    <InputParameters>
      <InputParameter Id="value" DataType="string" Value=""/>
    </InputParameters>
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="extension_termsOfUseConsentVersion" TransformationClaimType="createdClaim" />
    </OutputClaims>
  </ClaimsTransformation>
  <ClaimsTransformation Id="GetNewUserAgreeToTermsOfUseConsentVersion" TransformationMethod="CreateStringClaim">
    <InputParameters>
      <InputParameter Id="value" DataType="string" Value="V1"/>
    </InputParameters>
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="extension_termsOfUseConsentVersion" TransformationClaimType="createdClaim" />
    </OutputClaims>
  </ClaimsTransformation>
  <ClaimsTransformation Id="IsTermsOfUseConsentRequiredForVersion" TransformationMethod="CompareClaimToValue">
    <InputClaims>
      <InputClaim ClaimTypeReferenceId="extension_termsOfUseConsentVersion" TransformationClaimType="inputClaim1" />
    </InputClaims>
    <InputParameters>
      <InputParameter Id="compareTo" DataType="string" Value="V1" />
      <InputParameter Id="operator" DataType="string" Value="not equal" />
      <InputParameter Id="ignoreCase" DataType="string" Value="true" />
    </InputParameters>
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="termsOfUseConsentRequired" TransformationClaimType="outputClaim" />
    </OutputClaims>
  </ClaimsTransformation>
</ClaimsTransformations>

后续步骤