

# 单值和多值上下文键
<a name="reference_policies_condition-single-vs-multi-valued-context-keys"></a>

单值键和多值上下文键之间的差异取决于[请求上下文](intro-structure.md#intro-structure-request)中的值数量，而不是策略条件中的值数量。
+ *单值*上下文键在请求上下文中最多有一个值。例如，当您在 Amazon 中标记资源时，每个资源标签都存储为键值对。由于资源标签键只能具有单个标签值，因此 [aws:ResourceTag/*tag-key*](reference_policies_condition-keys.md#condition-keys-resourcetag) 为单值上下文键。请勿将条件集合运算符用于单值上下文键。
+ *多值*上下文键在请求上下文中可以有多个值。例如，当您在 Amazon 中标记资源时，您可以在请求中包含多个标签键值对。因此，[aws:TagKeys](reference_policies_condition-keys.md#condition-keys-tagkeys) 是多值上下文键。多值上下文键需要条件条件集合运算符。

例如，一个请求最多可以来自一个 VPC 端点，因此 [aws:SourceVpce](reference_policies_condition-keys.md#condition-keys-sourcevpce) 是单值上下文键。由于服务可以有多个属于该服务的服务主体名称，因此 [aws:PrincipalServiceNamesList](reference_policies_condition-keys.md#condition-keys-principalservicenameslist) 是多值上下文键。

**重要**  
单值键和多值上下文键之间的差异取决于请求上下文中的值数量，而不是策略条件中的值数量。

## 关键点
<a name="reference_policies_condition-key-points"></a>
+ *单值*和*多值*分类作为*值类型*包含在 [Amazon 全局条件上下文密钥](reference_policies_condition-keys.md) 主题每个条件上下文键的描述中。
+ [服务授权参考](https://docs.amazonaws.cn/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html)中的多值上下文键使用 `ArrayOf` 前缀，后跟条件运算符类别类型，例如 `ArrayOfString` 或 `ArrayOfARN`，表示请求可能包含条件上下文键的多个值。
+ 您可以使用任何可用的单值上下文键作为策略变量，但不能使用多值上下文键作为策略变量。有关策略变量的更多信息，请参阅 [IAM policy 元素：变量和标签](reference_policies_variables.md)。
+ 使用包含键值对的上下文键时，请务必注意，尽管可以有多个标签键值，但每个 `tag-key` 只能有一个值。
  + [aws:PrincipalTag/*tag-key*](reference_policies_condition-keys.md#condition-keys-principaltag)、[aws:RequestTag/*tag-key*](reference_policies_condition-keys.md#condition-keys-requesttag) 和 [aws:ResourceTag/*tag-key*](reference_policies_condition-keys.md#condition-keys-resourcetag) 是单值上下文键。
  + [aws:TagKeys](reference_policies_condition-keys.md#condition-keys-tagkeys) 定义请求中允许使用的标签键，但不包含标签键值。由于您可以在一个请求中包含多个标签键值对，因此 `aws:TagKeys` 是一个多值上下文键。
+ 多值上下文键需要条件条件集合运算符。请勿将条件集合运算符 `ForAllValues` 或 `ForAnyValue` 用于单值上下文键。使用带有单值上下文键的条件集合运算符可能会导致过于宽容的策略。

## 多值上下文键的集合运算符
<a name="reference_policies_condition-multi-valued-context-keys"></a>

要将条件上下文键与具有多个键值的[请求上下文](intro-structure.md#intro-structure-request)键进行比较，必须使用 `ForAllValues` 或 `ForAnyValue` 集合运算符。这些集合运算符用于比较两组值，例如请求中的标签集和策略条件中的标签集。

限定词 `ForAllValues` 和 `ForAnyValue` 为条件运算符添加了集合运算功能，从而使您可以针对策略条件中的多个上下文键值测试具有多个值的请求上下文键。此外，如果在策略中包含带有通配符或变量的多值字符串上下文键，则还必须使用 `StringLike` [条件运算符](reference_policies_elements_condition_operators.md#Conditions_String)。如果有多个条件键值，则必须像[数组](reference_policies_grammar.md#policies-grammar-json)一样用方括号括起来，例如 `"Key2":["Value2A", "Value2B"]`。

### ForAllValues
<a name="reference_policies_condition-forallvalues"></a>

`ForAllValues` 限定符测试请求上下文中每个成员的值是否与其后跟的条件运算符匹配。如果请求中的每个上下文键值均与策略中的一个上下文键值匹配，则条件返回 `true`。如果请求中没有上下文键，则它也会返回 `true`。

**重要**  
如果将 `ForAllValues` 与 `Allow` 效果一起使用，请小心谨慎，因为如果请求上下文中意外出现缺失的上下文键，则策略可能会过于宽松。您应始终在策略中包含具有 `false` 值的 [`Null`](reference_policies_elements_condition_operators.md#Conditions_Null) 条件运算符，以检查上下文键是否存在且其值不为空。有关示例，请参阅[根据标签键控制访问](access_tags.md#access_tags_control-tag-keys)。

#### ForallValues 集合运算符示例
<a name="reference_policies_condition-forallvalues-example"></a>

在以下示例中，ForAllValues 与 aws:TagKeys 一起使用，允许用户删除分配给 EC2 实例的特定标签。此策略仅允许用户删除 `environment` 和 `cost-center` 标签。您可以单独删除它们，也可以将其一起删除。请求中的标签键必须与策略中指定的键完全匹配。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:DeleteTags",
            "Resource": "arn:aws:ec2:us-east-1:111122223333:instance/*",
            "Condition": {
                "ForAllValues:StringEquals": {
                    "aws:TagKeys": [
                        "environment",
                        "cost-center"
                    ]
                },
                "Null": {
                    "aws:TagKeys": "false"
                }
            }
        }
    ]
}
```

------

下表显示了 Amazon 如何根据请求中的条件键值来评估此策略。


| 策略条件 | 请求上下文 | 结果 | 
| --- | --- | --- | 
|  <pre>"ForAllValues:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />},<br />"Null": {<br />  "aws:TagKeys": "false"<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment</pre>  |  **匹配**  | 
|  <pre>"ForAllValues:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />},<br />"Null": {<br />  "aws:TagKeys": "false"<br />}</pre>  | <pre>aws:TagKeys:<br />  – cost-center</pre>  |  **匹配**  | 
|  <pre>"ForAllValues:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />},<br />"Null": {<br />  "aws:TagKeys": "false"<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment<br />  – cost-center</pre>  |  **匹配**  | 
|  <pre>"ForAllValues:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />},<br />"Null": {<br />  "aws:TagKeys": "false"<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment<br />  – dept</pre>  |  **不匹配**  | 
|  <pre>"ForAllValues:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />},<br />"Null": {<br />  "aws:TagKeys": "false"<br />}</pre>  |  请求上下文中没有 `aws:TagKeys`。  |  **不匹配**  | 

请注意，在最后一个示例中，结果为“无匹配”，因为当上下文键缺失时，空条件检查会阻止匹配。这是避免过于宽松的策略的最佳实践。

### ForAnyValue
<a name="reference_policies_condition-foranyvalue"></a>

`ForAnyValue` 限定符测试请求上下文键值集中的至少一个成员是否与策略条件中上下文键值集中的至少一个成员匹配。如果请求中的任何一个上下文键值与策略中的任何一个上下文键值匹配，则条件返回 `true`。如果没有匹配的上下文键或者键不存在，则条件返回 `false`。

**重要**  
当使用具有 `Deny` 效果的 `ForAnyValue` 时，如果上下文键不存在于请求中，则策略的评估结果为**不匹配**。为了确保行为一致，请在策略中添加显式 [`Null`](reference_policies_elements_condition_operators.md#Conditions_Null) 条件检查，以验证上下文键是否存在。有关更多信息，请参阅 [用于检查条件键是否存在的条件运算符](reference_policies_elements_condition_operators.md#Conditions_Null)。

#### AnyValue 集合运算符示例
<a name="reference_policies_condition-foranyvalue-example"></a>

在以下示例中，ForAnyValue 与 aws:TagKeys 一起使用，允许用户删除分配给 EC2 实例的特定标签。如果请求中指定的标签键包括 `environment` 或 `cost-center`，则此策略允许用户删除实例的标签。请求可以包含策略中指定的标签键以外的其他标签键，但必须至少包含一个指定的键才能匹配条件。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:DeleteTags",
            "Resource": "arn:aws:ec2:us-east-1:111122223333:instance/*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "aws:TagKeys": [
                        "environment",
                        "cost-center"
                    ]
                }
            }
        }
    ]
}
```

------

下表显示了 Amazon 如何根据请求中的条件键值来评估此策略。


| 策略条件 | 请求上下文 | 结果 | 
| --- | --- | --- | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment</pre>  |  **匹配**  | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – cost-center</pre>  |  **匹配**  | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment<br />  – cost-center</pre>  |  **匹配**  | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment<br />  – dept</pre>  |  **匹配**  | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – dept</pre>  |  **不匹配**  | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  |  请求上下文中没有 `aws:TagKeys`。  |  **不匹配**  | 