

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Adicionando contexto
<a name="context"></a>

O *contexto* é a informação relevante para as decisões políticas, mas não faz parte da identidade de seu diretor, ação ou recurso. A reivindicação do token de acesso é contextual. Talvez você queira permitir uma ação somente de um conjunto de endereços IP de origem ou somente se o usuário tiver feito login com o MFA. Seu aplicativo tem acesso a esses dados contextuais da sessão e deve preenchê-los para solicitações de autorização. Os dados de contexto em uma solicitação de autorização de permissões verificadas devem ser formatados em JSON em um elemento. `contextMap`

Os exemplos que ilustram esse conteúdo vêm de um [exemplo de armazenamento de políticas](policy-stores-create.md). Para acompanhar, crie o repositório **DigitalPetStore**de políticas de amostra em seu ambiente de teste.

O objeto de contexto a seguir declara um de cada tipo de dados do Cedar para um aplicativo com base no exemplo de armazenamento de **DigitalPetStore**políticas.

```
"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"
    }
  }
}
```Tipos de dados no contexto de autorização

**Booleano**  
Um binário `true` ou `false` valor. No exemplo, o valor booleano de `true` for `MfaAuthenticated` indica que o cliente realizou a autenticação multifatorial antes de solicitar a visualização do pedido.

**Defina**  
Uma coleção de elementos de contexto. Os membros do conjunto podem ser todos do mesmo tipo, como neste exemplo, ou de tipos diferentes, incluindo um conjunto aninhado. No exemplo, o cliente está associado a três contas diferentes.

**String**  
Uma sequência de letras, números ou símbolos, entre `"` caracteres. No exemplo, a `UserAgent` string representa o navegador que o cliente usou para solicitar a visualização do pedido.

**Longo**  
Um valor inteiro. No exemplo, `RequestedOrderCount` indica que essa solicitação faz parte de um lote que resultou da solicitação do cliente para visualizar quatro de seus pedidos anteriores.

**Registro**  
Uma coleção de atributos. Você deve declarar esses atributos no contexto da solicitação. Um repositório de políticas com um esquema deve incluir essa entidade e os atributos da entidade no esquema. No exemplo, o `NetworkInfo` registro contém informações sobre o IP de origem do usuário, a geolocalização desse IP conforme determinado pelo cliente e a criptografia em trânsito.

**EntityIdentifier**  
Uma referência a uma entidade e atributos declarados no `entities` elemento da solicitação. No exemplo, o pedido do usuário foi aprovado pelo funcionário`Bob`.

Para testar esse contexto de exemplo no **DigitalPetStore**aplicativo de exemplo, você deve atualizar sua solicitação`entities`, seu esquema de armazenamento de políticas e a política estática com a descrição **Customer Role - Get Order**.

## Modificando DigitalPetStore para aceitar o contexto de autorização
<a name="authorization-context-example"></a>

Inicialmente, não **DigitalPetStore**é um repositório de políticas muito complexo. Ele não inclui nenhuma política ou atributo de contexto pré-configurado para dar suporte ao contexto que apresentamos. Para avaliar um exemplo de solicitação de autorização com essas informações de contexto, faça as seguintes modificações em seu repositório de políticas e em sua solicitação de autorização. Para exemplos de contexto com informações de token de acesso como contexto, consulte [Mapeamento de tokens de Amazon Cognito acesso e Mapeamento de tokens](cognito-map-token-to-schema.md#cognito-map-access-token) [de acesso OIDC](oidc-map-token-to-schema.md#oidc-map-access-token).

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

Aplique as seguintes atualizações ao esquema do repositório de políticas para oferecer suporte aos novos atributos de contexto. Atualize `GetOrder` da `actions` seguinte forma.

```
"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"
    ]
  }
}
```

Para referenciar o tipo de `record` dados nomeado `NetworkInfo` em seu contexto de solicitação, crie uma construção [CommonType](https://docs.cedarpolicy.com/schema/schema.html#schema-commonTypes) em seu esquema adicionando o seguinte ao seu esquema anterior. `actions` Uma `commonType` construção é um conjunto compartilhado de atributos que você pode aplicar a diferentes entidades.

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

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

A política a seguir configura condições que devem ser atendidas por cada um dos elementos de contexto fornecidos. Ele se baseia na política estática existente com a descrição **Customer Role - Get Order**. Inicialmente, essa política exige apenas que o principal que faz uma solicitação seja o proprietário do recurso.

```
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*"
};
```

Agora exigimos que a solicitação para recuperar um pedido atenda às condições de contexto adicionais que adicionamos à solicitação.

1. O usuário deve ter feito login com o MFA.

1. O navegador da web do usuário `User-Agent` deve conter a string`My UserAgent`.

1. O usuário deve ter solicitado a visualização de 4 ou menos pedidos.

1. Um dos códigos de conta do usuário deve ser`111122223333`.

1. O endereço IP do usuário deve ser originário dos Estados Unidos da América, ele deve estar em uma sessão criptografada e seu endereço IP deve começar com. `192.0.2.`

1. Um funcionário deve ter aprovado seu pedido. No `entities` elemento da solicitação de autorização, declararemos um usuário `Bob` que tem a função de`Employee`.

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

Depois de configurar seu repositório de políticas com o esquema e a política apropriados, você pode apresentar essa solicitação de autorização à operação [IsAuthorized](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_IsAuthorized.html)da API de permissões verificadas. Observe que o `entities` segmento contém uma definição de`Bob`, um usuário com uma função de`Employee`.

```
{
  "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"
}
```

------