

# IAM JSON 策略元素：Condition
<a name="reference_policies_elements_condition"></a>

`Condition` 元素（或 `Condition`* 块*）允许您指定策略生效的条件。`Condition` 元素是可选的。在 `Condition` 元素中，您可构建表达式并使用[条件运算符](reference_policies_elements_condition_operators.md)（等于、小于和其他）将策略中的上下文键和值与请求上下文中的键和值进行匹配。要了解有关请求上下文的更多信息，请参阅[请求的组成部分](intro-structure.md#intro-structure-request)。

```
"Condition" : { "{condition-operator}" : { "{condition-key}" : "{condition-value}" }}
```

您在策略条件中指定的上下文键可以是[全局条件上下文键](reference_policies_condition-keys.md)或特定于服务的上下文键。全局条件上下文键具有 `aws:` 前缀。特定于服务的上下文键具有服务的前缀。例如，Amazon EC2 允许您使用服务独有的 `ec2:InstanceType` 上下文键来编写条件。要查看带 `iam:` 前缀的特定于服务的 IAM 上下文键，请参阅 [IAM 和 Amazon STS 条件上下文密钥](reference_policies_iam-condition-keys.md)。

上下文键*名称*不区分大小写。例如，包含 `aws:SourceIP` 上下文键等效于测试 `AWS:SourceIp`。上下文键*值* 是否区分大小写取决于您使用的[条件运算符](reference_policies_elements_condition_operators.md)。例如，以下条件包含 `StringEquals` 运算符，以确保只有 `john` 提出的请求才符合条件。名为 `John` 的用户会被拒绝访问。

```
"Condition" : { "StringEquals" : { "aws:username" : "john" }}
```

以下条件使用 [`StringEqualsIgnoreCase`](reference_policies_elements_condition_operators.md#Conditions_String) 运算符来匹配名为 `john` 或 `John` 的用户。

```
"Condition" : { "StringEqualsIgnoreCase" : { "aws:username" : "john" }}
```

某些上下文键支持允许您指定键名称的一部分的键/值对。示例包括 [`aws:RequestTag/tag-key`](reference_policies_condition-keys.md#condition-keys-requesttag) 上下文键、Amazon KMS [https://docs.amazonaws.cn/kms/latest/developerguide/policy-conditions.html#conditions-kms-encryption-context](https://docs.amazonaws.cn/kms/latest/developerguide/policy-conditions.html#conditions-kms-encryption-context) 和多个服务支持的 [`ResourceTag/tag-key`](reference_policies_condition-keys.md#condition-keys-resourcetag) 上下文键。
+ 如果您对 [Amazon EC2](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/iam-policy-structure.html#amazon-ec2-keys) 等服务使用 `ResourceTag/tag-key` 上下文键，则必须指定 `tag-key` 的键名称。
+ **键名称不区分大小写。**这意味着，如果您在策略的条件元素中指定 `"aws:ResourceTag/TagKey1": "Value1"`，则条件将匹配名为 `TagKey1` 或 `tagkey1` 的资源标签键，但不会同时匹配两者。
+ 支持这些属性的 Amazon 服务可能允许您创建多个仅大小写不同的键名称。例如，您可能需要通过 `ec2=test1` 和 `EC2=test2` 标记 Amazon EC2 实例。在使用 `"aws:ResourceTag/EC2": "test1"` 等条件以允许访问该资源时，键名称匹配两个标签，但仅一个值匹配。这可能会导致意外的条件失败。

**重要**  
最佳实践是，在命名键-值对属性时，请确保您的账户成员遵循一致的命名约定。示例包括标签或 Amazon KMS 加密上下文。您可以使用 [`aws:TagKeys`](reference_policies_condition-keys.md#condition-keys-tagkeys) 上下文键（用于标记）或 [https://docs.amazonaws.cn/kms/latest/developerguide/policy-conditions.html#conditions-kms-encryption-context-keys](https://docs.amazonaws.cn/kms/latest/developerguide/policy-conditions.html#conditions-kms-encryption-context-keys)（用于 Amazon KMS 加密上下文）强制实现此目的。
+ 有关所有条件运算符及其工作原理描述的列表，请参阅[条件运算符](reference_policies_elements_condition_operators.md)。
+ 除非另行指定，否则所有上下文键均可有多个值。有关如何处理具有多个值的上下文键，请参阅 [多值上下文键的集合运算符](reference_policies_condition-single-vs-multi-valued-context-keys.md#reference_policies_condition-multi-valued-context-keys)。
+ 有关所有全局可用的上下文键的列表，请参阅 [Amazon 全局条件上下文密钥](reference_policies_condition-keys.md)。
+ 有关每个服务定义的条件上下文键，请参阅 [Amazon 服务的操作、资源和条件键](reference_policies_actions-resources-contextkeys.html)。

## 请求上下文
<a name="AccessPolicyLanguage_RequestContext"></a>

当[主体](https://docs.amazonaws.cn/glossary/latest/reference/glos-chap.html?icmpid=docs_homepage_addtlrcs#principal)向 Amazon 发出[请求](intro-structure.md#intro-structure-request)时，Amazon 会将请求信息收集到请求上下文中。请求上下文包括有关主体、资源、操作和其他环境属性的信息。策略评估将策略中的属性与请求中发送的属性进行匹配，以评估和授权您可以在 Amazon 中执行的操作。

您可以使用 JSON 策略的 `Condition` 元素来针对请求上下文测试特定上下文键。例如，您可以创建一个策略，该策略使用 [aws:CurrentTime](reference_policies_condition-keys.md#condition-keys-currenttime) 上下文键以[允许用户仅在特定的日期范围内执行操作](reference_policies_examples_aws-dates.md)。

以下示例显示了 Martha Rivera 发送停用其 MFA 设备的请求时的请求上下文表示。

```
Principal: AROA123456789EXAMPLE
Action: iam:DeactivateMFADevice
Resource: arn:aws:iam::user/martha
Context:
  – aws:UserId=AROA123456789EXAMPLE:martha
  – aws:PrincipalAccount=1123456789012
  – aws:PrincipalOrgId=o-example
  – aws:PrincipalARN=arn:aws:iam::1123456789012:assumed-role/TestAR
  – aws:MultiFactorAuthPresent=true
  – aws:MultiFactorAuthAge=2800
  – aws:CurrentTime=...
  – aws:EpochTime=...
  – aws:SourceIp=...
```

请求上下文与允许用户删除自己的多重身份验证 (MFA) 设备的策略进行匹配，但前提是他们在过去一小时（3,600 秒）内使用 MFA 登录。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Sid": "AllowRemoveMfaOnlyIfRecentMfa",
        "Effect": "Allow",
        "Action": [
            "iam:DeactivateMFADevice"
        ],
        "Resource": "arn:aws:iam::*:user/${aws:username}",
        "Condition": {
            "NumericLessThanEquals": {"aws:MultiFactorAuthAge": "3600"}
        }
    }
}
```

------

在此示例中，该策略与请求上下文匹配：操作相同，资源与“\$1”通配符匹配，并且 `aws:MultiFactorAuthAge` 的值为 2800，小于 3600，因此该策略允许此授权请求。

Amazon 会评估策略中的每个上下文键，并返回 *true* 或 *false* 值。请求中不存在的上下文键会视为不匹配。

请求上下文可返回以下值：
+ **True** - 如果请求者在过去 1 小时或更短时间内已使用 MFA 进行登录，则条件返回 *true*。
+ **False** - 如果请求者在 1 小时前已使用 MFA 进行登录，则条件返回 *false*。
  + **Not present**（不存在）- 如果请求者已使用其 IAM 用户访问密钥在 Amazon CLI 或 Amazon API 中发出请求，则键不存在。在此情况下，键不存在，并且它不匹配。

**注意**  
在某些情况下，当条件键值不存在时，条件仍然可以返回 true。例如，如果您添加 `ForAllValues` 限定符，则当请求中不存在上下文键时，请求将返回 true。为了防止缺失的上下文键或具有空值的上下文键评估为 true，您可以在策略中包含具有 `false` 值的 [Null 条件运算符](reference_policies_elements_condition_operators.md#Conditions_Null)，以检查上下文键是否存在且其值不为空。

## 条件块
<a name="AccessPolicyLanguage_ConditionBlock"></a>

以下示例显示 `Condition` 元素的基本格式：

```
"Condition": {"StringLike": {"s3:prefix": ["jane/*"]}}
```

请求中的值由上下文键表示，在此示例中为 `s3:prefix`。将上下文密钥值与您指定为文本值的值进行比较，例如 `jane/*`。要进行的比较类型由[条件运算符](reference_policies_elements_condition_operators.md)指定（此处为 `StringLike`）。您可以使用典型的布尔比较（例如等于、大于和小于）来创建比较字符串、日期、数字等的条件。使用[字符串运算符](reference_policies_elements_condition_operators.md#Conditions_String)或 [ARN 运算符](reference_policies_elements_condition_operators.md#Conditions_ARN)时，还可以在上下文键值中使用[策略变量](reference_policies_variables.md)。以下示例包括 `aws:username` 变量。

```
"Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}}
```

在某些情况下，上下文键可能包含多个值。例如，对 Amazon DynamoDB 的请求可能需要从表返回或更新多个属性。访问 DynamoDB 表的策略可能包含 `dynamodb:Attributes` 上下文键，此键包含请求中列出的所有属性。您可以使用 `Condition` 元素中的集合运算符，根据策略中的允许属性列表测试请求中的多个属性。有关更多信息，请参阅 [多值上下文键的集合运算符](reference_policies_condition-single-vs-multi-valued-context-keys.md#reference_policies_condition-multi-valued-context-keys)。

在请求期间评估策略时，Amazon 会将键替换为请求中的相应值。(在此示例中，Amazon 将使用请求的日期和时间。) 将对条件进行评估以返回 true 或 false，然后再整体考虑策略是允许还是拒绝请求。

### 一个条件中包含多个值
<a name="Condition-multiple-conditions"></a>

一个 `Condition` 元素可以包含多个条件运算符，而每个条件运算符又可以包含多个上下文键值对。下图对此进行了说明。

![\[两个条件运算符方框图。第一个块包含两个上下文键占位符，每个占位符都有多个值。第二个条件块包含一个具有多个值的上下文键。\]](http://docs.amazonaws.cn/IAM/latest/UserGuide/images/AccessPolicyLanguage_Condition_Block.diagram.png)


有关更多信息，请参阅 [多值上下文键的集合运算符](reference_policies_condition-single-vs-multi-valued-context-keys.md#reference_policies_condition-multi-valued-context-keys)。