

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# ACR 和 AMR 声明的身份验证级别
<a name="cognito-user-pools-step-up-authentication"></a>

Amazon Cognito 可以记录用户身份验证的强度以及他们使用的方法。当用户登录时，您可以提供目标身份验证级别作为输入，Amazon Cognito 将用户达到的级别以及他们完成的方法作为其发放的令牌中的声明进行报告。这些声明适用于任何登录，包括用户的初始登录。

您可以使用托管登录授权和登录端点上的`acr_values`参数或 `USER_AUTH` API 流程中的等效`TARGET_ACR_VALUES`参数来请求身份验证级别。两者都接受目标身份验证级别的有序列表。您可以添加可选`max_age`参数（`MAX_AGE`在 API 中），要求用户在最近的时间窗口内进行身份验证。作为对这些输入的回应，Amazon Cognito在其发行的代币中增加了两个声明：
+ 例如，`acr`声明是一个字符串，它表示用户满足的身份验证级别`urn:cognito:loa:3`。
+ 例如，`amr`声明是一个字符串数组，用于指示用户完成的身份验证方法`["pwd", "otp", "mfa"]`。

`acr`和`amr`声明遵循 OpenID Connect Core 规范中的定义。亚马逊 Cognito 使用自己的 ACR 级别 URI。您可以将 Amazon Cognito 级别转换为应用程序所需的任何标准。

Step-up 身份验证是这些声明的常见用例。在升级身份验证中，您的应用程序要求用户在执行敏感操作之前使用更强的方法进行身份验证。要决定是否提示，您的应用程序会将用户 ID 令牌中的`acr`级别和`auth_time`声明与操作所需的级别和新鲜度进行比较，并且仅在尚未满足这些级别和新鲜度时才请求加强。需要升级时，将用户重定向到托管登录授权或登录端点`acr_values`，或者使用调用 `USER_AUTH` API 流程。`TARGET_ACR_VALUES`有关示例，请参阅[Step-up 身份验证](cognito-scenarios.md#scenario-step-up-authentication)场景。

您可以从任何 Amazon Cognito 登录入口点申请 ACR 和 AMR。每个入口点的机制都与该入口点一起记录下来。
+ SDK 和 API 登录-使用`TARGET_ACR_VALUES`和`MAX_AGE`参数请求`USER_AUTH`流程中的目标级别。有关参数和升压行为，请参阅[Step-up 使用 USER\_AUTH 流程进行身份验证](authentication-flows-selection-sdk.md#cognito-user-pools-step-up-user-auth)。
+ 托管登录和托管用户界面-在授权`acr_values`和登录端点上传递和`max_age`参数。有关详细信息，请参阅[授权端点](authorization-endpoint.md#authorization-endpoint-step-up)和[登录端点](login-endpoint.md#login-endpoint-step-up)。
+ 联合登录 — Amazon Cognito 从身份提供商 (IdP) 的响应中获取联合用户的 ACR 和 AMR 值，并将它们与该字段映射。`AcrMapping`有关 OIDC 身份提供商的信息，请参阅。[Step-up 联合用户身份验证](cognito-user-pools-oidc-idp.md#cognito-user-pools-step-up-federation)

请求升级身份验证需要使用基本版或增强版功能计划。有关更多信息，请参阅 [功能计划要求](#cognito-user-pools-step-up-authentication-tiers)。

**Topics**
+ [身份验证级别和方法](#cognito-user-pools-step-up-authentication-concepts)
+ [配置 ACR 级别名称](#cognito-user-pools-step-up-acr-configuration)
+ [功能计划要求](#cognito-user-pools-step-up-authentication-tiers)
+ [您对升级身份验证的责任](#cognito-user-pools-step-up-responsibilities)

## 身份验证级别和方法
<a name="cognito-user-pools-step-up-authentication-concepts"></a>

Amazon Cognito 会评估用户完成的身份验证因素，并将结果表示为`acr`索赔中的身份验证级别和声明中的身份验证方法列表。`amr`

### ACR 身份验证级别
<a name="cognito-user-pools-step-up-acr-levels"></a>

Amazon Cognito 定义了四个固定的身份验证级别。满足每个级别的身份验证因子组合是固定的，您无法对其进行更改。您只能为用户池自定义每个级别的 URI 名称。有关更多信息，请参阅 [配置 ACR 级别名称](#cognito-user-pools-step-up-acr-configuration)。

Amazon Cognito 会分配用户完成的要素完全满足的最高身份验证级别。


**ACR 水平和令人满意的因子组合**  

| ACR 等级 | 默认 ACR 值 | 令人满意的因子组合 | 
| --- | --- | --- | 
| 1 | urn:cognito:loa:1 | 仅限密码 | 
| 2 | urn:cognito:loa:2 | 通过短信或电子邮件发送的一次性密码。第 2 级不包括密钥 | 
| 3 | urn:cognito:loa:3 | 单独的密钥（平台或漫游）；或带有短信一次性验证码的密码；或带有电子邮件一次性密码的密码 | 
| 4 | urn:cognito:loa:4 | 来自身份验证器应用程序的带有基于时间的一次性密码 (TOTP) 的密码 | 

级别 1 表示仅使用密码的身份验证。Federation 无法通过此表满足任何级别。相反，Amazon Cognito 从身份提供商 (IdP) 的响应中推导出联合用户的身份验证级别。有关更多信息，请参阅 [Step-up 联合用户身份验证](cognito-user-pools-oidc-idp.md#cognito-user-pools-step-up-federation)。

### 抗生素耐药性值
<a name="cognito-user-pools-step-up-amr-values"></a>

`amr`声明是一个字符串列表。用户完成的每个身份验证因素都会将其值添加到列表中。Amazon Cognito 可以添加以下值。


**抗生素耐药性值**  

| 身份验证方法 | AMR 值 | 注意 | 
| --- | --- | --- | 
| 密码 | pwd | Password-family 登录，包括安全远程密码 (SRP) | 
| 来自身份验证器应用程序的 TOTP | otp | 来自应用程序（例如身份验证器应用程序）的基于时间的一次性密码 | 
| 短信一次性验证码 | sms | 通过短信发送的一次性验证码 | 
| 通过电子邮件发送一次性验证码 | email\_otp | 通过电子邮件发送的一次性验证码 | 
| 带有平台身份验证器的密钥 | swk | 软件绑定密钥，例如由设备生物识别保护的密钥 | 
| 带有漫游身份验证器的密钥 | hwk | 硬件绑定密钥，例如安全密钥 | 
| Multi-factor 组合 | mfa | 当用户完成两个或更多不同因素时添加 | 
| 联合登录 | fed | Amazon Cognito 在用户通过不支持 ACR 和 AMR 的 IdP 进行联合或不返回 Amazon Cognito 可识别的值时添加的默认占位符 | 

### ACR 和 AMR 代币索赔
<a name="cognito-user-pools-step-up-token-claims"></a>

Amazon Cognito 添加`acr`并`amr`声明访问令牌和 ID 令牌。您的应用程序会检查访问令牌或 ID 令牌中的`acr`和`amr`声明，以评估身份验证级别。当用户刷新令牌时，Amazon Cognito 会在新的访问令牌`amr`和 ID 令牌上保留`acr`相同的和值，因此用户在每次刷新后都不会被要求再次加强。有关令牌内容的更多信息，请参阅[使用 ID 令牌](amazon-cognito-user-pools-using-the-id-token.md)和[使用访问令牌](amazon-cognito-user-pools-using-the-access-token.md)。

以下示例显示了用户使用密码和 TOTP 进行身份验证后的 ID 令牌。

```
{
  "sub": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
  "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_ExAmPlE",
  "aud": "abc123def456",
  "exp": 1759348800,
  "iat": 1759345200,
  "auth_time": 1759345200,
  "token_use": "id",
  "acr": "urn:cognito:loa:4",
  "amr": ["pwd", "otp", "mfa"],
  "email": "user@example.com",
  "cognito:username": "a1b2c3d4-5678-90ab-cdef-1234567890ab"
}
```

当用户刷新令牌时，Amazon Cognito 会对新的访问令牌`amr`和 ID 令牌设置`acr`相同的值。这些值未经修改即可延续。这种行为提供了更流畅的体验，因为用户在每次刷新后都不会被要求再次加强。

刷新令牌并不能重置`auth_time`索赔。如果要强制用户在一段时间后再次进行身份验证，请使用`max_age`参数，该参数会将当前时间与用户刷新令牌的次数进行比较。`auth_time`

当用户完成升级身份验证后，Amazon Cognito 会发布新的访问权限、ID 和刷新令牌，其中包含`acr`更新的索赔`amr`和新的有效期。

## 配置 ACR 级别名称
<a name="cognito-user-pools-step-up-acr-configuration"></a>

您可以使用`AcrConfiguration`字段为用户池自定义每个身份验证级别的 URI 名称。使用或[UpdateUserPool](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html)操作创建或更新用户池时，请配置此字段。[CreateUserPool](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html)满足每个水平的因子组合保持不变。您只能自定义名称。

使用该`AcrConfiguration`字段配置自定义 ACR 等级名称需要基础版或增强版功能计划。有关更多信息，请参阅 [功能计划要求](#cognito-user-pools-step-up-authentication-tiers)。

该`AcrConfiguration`字段是一张地图，其中包含密钥`Level1`通过`Level4`。每个值都是一个包含单个`AcrValue`字符串的对象。您只能覆盖要自定义的关卡。以下示例请求自定义级别 2 和 3 的名称。

```
{
  "AcrConfiguration": {
    "Level2": { "AcrValue": "urn:my-standard:loa:2" },
    "Level3": { "AcrValue": "urn:my-standard:loa:3" }
  }
}
```

响应始终返回有效的配置，其中包含您未自定义的任何关卡的默认名称。

```
{
  "AcrConfiguration": {
    "Level1": { "AcrValue": "urn:cognito:loa:1" },
    "Level2": { "AcrValue": "urn:my-standard:loa:2" },
    "Level3": { "AcrValue": "urn:my-standard:loa:3" },
    "Level4": { "AcrValue": "urn:cognito:loa:4" }
  }
}
```

以下验证规则适用于每个`AcrValue`。
+ 每个关卡在所有四个关卡中都`AcrValue`必须是唯一的。这包括为未自定义的关卡填写的默认名称。如果值与未自定义关卡的默认值发生冲突，则会被拒绝。
+ 每个字符串都`AcrValue`是 1 到 64 个字符的字符串。
+ 每个都`AcrValue`不能包含空格、双引号或反斜杠。

如果您更改 ACR 级别名称，则用户稍后可能会出示一个访问令牌，其`acr`值不再与任何已配置的级别匹配。Amazon Cognito 不尊重陈旧的价值，并将其视为无法识别的级别，但这不是错误。Amazon Cognito 仍然尊重代币的`amr`价值，只提示`amr`索赔中尚未列出的因素，而不记入任何特定等级。

## 功能计划要求
<a name="cognito-user-pools-step-up-authentication-tiers"></a>

以下功能需要基础版或增强版功能计划。
+ 正在请求升级身份验证。这适用于 on 的`TARGET_ACR_VALUES`参数`InitiateAuth`和托管登录的`acr_values`参数。
+ 使用`CreateUserPool`或`AcrConfiguration`字段配置自定义 ACR 级别名称`UpdateUserPool`。

在功能计划不足的情况下请求升级身份验证时的行为取决于入口点。
+ `InitiateAuth`API 会返回一个`FeatureUnavailableInTierException`。
+ 托管登录授权端点会静默忽略`acr_values`并继续进行普通身份验证，不会出现错误。

有关功能计划的更多信息，请参阅[用户池功能计划](cognito-sign-in-feature-plans.md)。

## 您对升级身份验证的责任
<a name="cognito-user-pools-step-up-responsibilities"></a>

Amazon Cognito 颁发的令牌具有用户达到的身份验证级别。您的应用程序负责以下几点。
+ 在重定向之前，请检查用户的当前 ID 令牌。根据您的应用程序已持有的令牌进行评估 `auth_time``max_age`，并根据操作所需的`acr`级别对 ID 令牌的等级进行评估。只有在尚未达到所需的级别或新鲜度时，才会将用户重定向到 Amazon Cognito 进行升级。
+ 设置正确的`TARGET_ACR_VALUES`或`acr_values`，以及正确的`MAX_AGE`或`max_age`。亚马逊 Cognito 仅对您提供的内容采取行动。它并不能推断出你想要的水平或新鲜度。如果您请求了错误的级别或省略了参数，Amazon Cognito 不会按照您的预期提高用户级别。
+ 在您的`acr`申请中验证索赔。在 Amazon Cognito 返回令牌后，您的应用程序必须先验证`acr`索赔是否符合操作要求的级别，然后才能授予访问权限。Amazon Cognito 发行已达到等级的代币。强制某项操作需要给定级别是您的应用程序的责任。
+ 将 Amazon Cognito 等级翻译成代币之外的其他标准。Amazon Cognito 计算身份`acr`验证`amr`流程中的和声明。您无法使用代币生成前 Lambda 触发器或任何其他 Lambda 触发器自定义、覆盖、添加或隐藏这些声明。如果您需要将 Amazon Cognito 级别转换为其他标准，例如 NIST 或 eIDA，请在您的应用程序层中执行此操作。