

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

# 添加上下文
<a name="context"></a>

*情境*是指与政策决策相关的信息，但不是您的委托人、行为或资源身份的一部分。访问令牌声明是上下文。您可能只想允许来自一组源 IP 地址的操作，或者仅当您的用户已使用 MFA 登录时才允许执行操作。您的应用程序可以访问此上下文会话数据，并且必须将其填充到授权请求中。已验证权限授权请求中的上下文数据在元素中必须采用 JSON 格式。`contextMap`

说明此内容的示例来自[策略存储库示](policy-stores-create.md)例。要继续操作，请在您的测试环境中创建**DigitalPetStore**示例策略存储。

以下上下文对象根据示例**DigitalPetStore**策略存储为应用程序声明每种 Cedar 数据类型之一。

```
"context": {
  "contextMap": {
    "AccountCodes": {
      "set": [
        {
          "long": 111122223333
        },
        {
          "long": 444455556666
        },
        {
          "long": 123456789012
        }
      ]
    },
    "approvedBy": {
    "entityIdentifier": {
      "entityId": "Bob",
      "entityType": "DigitalPetStore::User"
    }
    },
    "MfaAuthorized": {
      "boolean": true
    },
    "NetworkInfo": {
      "record": {
        "IPAddress": {
          "string": "192.0.2.178"
        },
        "Country": {
          "string": "United States of America"
        },
        "SSL": {
          "boolean": true
        }
    }
    },
    "RequestedOrderCount": {
      "long": 4
    },
    "UserAgent": {
      "string": "My UserAgent 1.12"
    }
  }
}
```授权上下文中的数据类型

**布尔值**  
二进制`true`或`false`值。在示例中，布尔值 f `true` or `MfaAuthenticated` 表示客户在请求查看订单之前已执行多因素身份验证。

**设置**  
上下文元素的集合。集合成员可以是完全相同的类型（如本例所示），也可以是不同的类型，包括嵌套的集合。在示例中，客户与 3 个不同的账户相关联。

**字符串**  
由字母、数字或符号组成的序列，用`"`字符括起来。在示例中，`UserAgent`字符串表示客户用来请求查看其订单的浏览器。

**长整型**  
一个整数。在示例中，`RequestedOrderCount`表示此请求是由于客户要求查看其过去的四个订单而产生的批次的一部分。

**记录**  
属性的集合。您必须在请求上下文中声明这些属性。带有架构的策略存储区必须在架构中包含该实体和该实体的属性。在示例中，`NetworkInfo`记录包含有关用户的原始 IP、由客户端确定的该 IP 的地理位置以及传输中的加密的信息。

**EntityIdentifier**  
对请求`entities`元素中声明的实体和属性的引用。在示例中，用户的订单已由员工批准`Bob`。

要**在示例**DigitalPetStore**应用程序中测试此示例上下文，您必须更新您的请求`entities`、策略存储架构和静态策略，描述为 Customer Role-Get Order**。

## 正在修改 DigitalPetStore 以接受授权上下文
<a name="authorization-context-example"></a>

最初，**DigitalPetStore**不是一个非常复杂的策略存储。它不包含任何预配置的策略或上下文属性来支持我们所呈现的上下文。要使用此上下文信息评估授权请求示例，请对您的策略存储和授权请求进行以下修改。有关以访问令牌信息为上下文的上下文示例，请参阅[映射 Amazon Cognito 访问令牌](cognito-map-token-to-schema.md#cognito-map-access-token)和[映射 OIDC 访问](oidc-map-token-to-schema.md#oidc-map-access-token)令牌。

------
#### [ Schema ]

对您的策略存储架构应用以下更新以支持新的上下文属性。更新`GetOrder``actions`如下。

```
"GetOrder": {
  "memberOf": [],
  "appliesTo": {
    "resourceTypes": [
      "Order"
    ],
    "context": {
      "type": "Record",
      "attributes": {
        "AccountCodes": {
          "type": "Set",
          "required": true,
          "element": {
            "type": "Long"
          }
        },
        "approvedBy": {
          "name": "User",
          "required": true,
          "type": "Entity"
        },
        "MfaAuthorized": {
          "type": "Boolean",
          "required": true
        },
        "NetworkInfo": {
          "type": "NetworkInfo",
          "required": true
        },
        "RequestedOrderCount": {
          "type": "Long",
          "required": true
        },
        "UserAgent": {
          "required": true,
          "type": "String"
        }
      }
    },
    "principalTypes": [
      "User"
    ]
  }
}
```

要引用在请求上下文`NetworkInfo`中命名的`record`数据类型，请在架构中创建一个 [CommonTyp](https://docs.cedarpolicy.com/schema/schema.html#schema-commonTypes) e 结构，方法是在`actions`架构中添加以下内容。`commonType`构造是一组共享的属性，您可以将其应用于不同的实体。

```
"commonTypes": {
  "NetworkInfo": {
    "attributes": {
      "IPAddress": {
        "type": "String",
        "required": true
      },
      "SSL": {
        "required": true,
        "type": "Boolean"
      },
      "Country": {
        "required": true,
        "type": "String"
      }
    },
    "type": "Record"
  }
},
```

------
#### [ Policy ]

以下策略设置了每个提供的上下文元素必须满足的条件。它建立在现有静态政策的基础上，描述为 “**客户角色-获取订单**”。该策略最初只要求发出请求的委托人是资源的所有者。

```
permit (
    principal in DigitalPetStore::Role::"Customer",
    action in [DigitalPetStore::Action::"GetOrder"],
    resource
) when {
    principal == resource.owner &&
    context.AccountCodes.contains(111122223333) &&
    context.approvedBy in DigitalPetStore::Role::"Employee" &&
    context.MfaAuthorized == true &&
    context.NetworkInfo.Country like "*United States*" &&
    context.NetworkInfo.IPAddress like "192.0.2.*" &&
    context.NetworkInfo.SSL == true &&
    context.RequestedOrderCount <= 4 &&
    context.UserAgent like "*My UserAgent*"
};
```

现在，我们要求检索订单的请求必须满足我们在请求中添加的其他上下文条件。

1. 用户必须使用 MFA 登录。

1. 用户的 Web 浏览器`User-Agent`必须包含字符串`My UserAgent`。

1. 用户必须请求查看 4 个或更少的订单。

1. 用户的账户代码之一必须是`111122223333`。

1. 用户的 IP 地址必须来自美国，他们必须处于加密会话中，并且他们的 IP 地址必须以`192.0.2.`开头。

1. 员工必须已批准他们的订单。在授权请求的`entities`元素中，我们将声明一个角色为的`Bob`用户`Employee`。

------
#### [ Request body ]

在使用适当的架构和策略配置策略存储后，您可以向 “已验证权限 API” 操作提交此授权请求[IsAuthorized](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_IsAuthorized.html)。请注意，该`entities`区段包含一个角色为的用户的定义`Employee`。`Bob`

```
{
  "principal": {
    "entityType": "DigitalPetStore::User",
    "entityId": "Alice"
  },
  "action": {
    "actionType": "DigitalPetStore::Action",
    "actionId": "GetOrder"
  },
  "resource": {
    "entityType": "DigitalPetStore::Order",
    "entityId": "1234"
  },
  "context": {
    "contextMap": {
      "AccountCodes": {
        "set": [
          {"long": 111122223333},
          {"long": 444455556666},
          {"long": 123456789012}
        ]
      },
      "approvedBy": {
        "entityIdentifier": {
          "entityId": "Bob",
          "entityType": "DigitalPetStore::User"
        }
      },
      "MfaAuthorized": {
        "boolean": true
      },
      "NetworkInfo": {
        "record": {
          "Country": {"string": "United States of America"},
          "IPAddress": {"string": "192.0.2.178"},
          "SSL": {"boolean": true}
        }
      },
      "RequestedOrderCount":{
        "long": 4
      },
      "UserAgent": {
        "string": "My UserAgent 1.12"
      }
    }
  },
  "entities": {
    "entityList": [
      {
        "identifier": {
          "entityType": "DigitalPetStore::User",
          "entityId": "Alice"
        },
        "attributes": {
          "memberId": {
            "string": "801b87f2-1a5c-40b3-b580-eacad506d4e6"
          }
        },
        "parents": [
          {
            "entityType": "DigitalPetStore::Role",
            "entityId": "Customer"
          }
        ]
      },
      {
        "identifier": {
          "entityType": "DigitalPetStore::User",
          "entityId": "Bob"
        },
        "attributes": {
          "memberId": {
            "string": "49d9b81e-735d-429c-989d-93bec0bcfd8b"
          }
        },
        "parents": [
          {
            "entityType": "DigitalPetStore::Role",
            "entityId": "Employee"
          }
        ]
      },
      {
        "identifier": {
          "entityType": "DigitalPetStore::Order",
          "entityId": "1234"
        },
        "attributes": {
          "owner": {
            "entityIdentifier": {
              "entityType": "DigitalPetStore::User",
              "entityId": "Alice"
            }
          }
        },
        "parents": []
      }
     ]
   },
   "policyStoreId": "PSEXAMPLEabcdefg111111"
}
```

------