

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Añadir contexto
<a name="context"></a>

El *contexto* es la información relevante para las decisiones políticas, pero no forma parte de la identidad del director, la acción o el recurso. La afirmación del token de acceso es el contexto. Es posible que desee permitir una acción solo desde un conjunto de direcciones IP de origen o solo si el usuario ha iniciado sesión con MFA. Su aplicación tiene acceso a estos datos de sesión contextuales y debe rellenarlos para las solicitudes de autorización. Los datos de contexto de una solicitud de autorización de permisos verificados deben tener formato JSON en un elemento. `contextMap`

Los ejemplos que ilustran este contenido provienen de un almacén de políticas de [muestra](policy-stores-create.md). Para continuar, cree el almacén de políticas de **DigitalPetStore**muestra en su entorno de pruebas.

El siguiente objeto de contexto declara uno de cada tipo de datos de Cedar para una aplicación según el almacén de **DigitalPetStore**políticas de muestra.

```
"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 datos en el contexto de la autorización

**Booleano**  
Un binario `true` o un `false` valor. En el ejemplo, el valor booleano `true` for `MfaAuthenticated` indica que el cliente ha realizado una autenticación multifactorial antes de solicitar ver su pedido.

**Establezca**  
Un conjunto de elementos contextuales. Los miembros del conjunto pueden ser todos del mismo tipo, como en este ejemplo, o de tipos diferentes, incluido un conjunto anidado. En el ejemplo, el cliente está asociado a 3 cuentas diferentes.

**Cadena**  
Secuencia de letras, números o símbolos, encerrados entre `"` caracteres. En el ejemplo, la `UserAgent` cadena representa el navegador que el cliente utilizó para solicitar ver su pedido.

**Largo**  
Un número entero. En el ejemplo, `RequestedOrderCount` indica que esta solicitud forma parte de un lote que surgió cuando el cliente solicitó ver cuatro de sus pedidos anteriores.

**Registro**  
Un conjunto de atributos. Debe declarar estos atributos en el contexto de la solicitud. Un almacén de políticas con un esquema debe incluir esta entidad y los atributos de la entidad en el esquema. En el ejemplo, el `NetworkInfo` registro contiene información sobre la IP de origen del usuario, la geolocalización de esa IP determinada por el cliente y el cifrado en tránsito.

**EntityIdentifier**  
Una referencia a una entidad y a los atributos declarados en el `entities` elemento de la solicitud. En el ejemplo, el empleado aprobó el pedido del usuario`Bob`.

Para probar este contexto de ejemplo en la **DigitalPetStore**aplicación de ejemplo, debes actualizar tu solicitud`entities`, el esquema del almacén de políticas y la política estática con la descripción **Customer Role: Get Order**.

## Modificar DigitalPetStore para aceptar el contexto de autorización
<a name="authorization-context-example"></a>

Inicialmente, no **DigitalPetStore**es un almacén de políticas muy complejo. No incluye políticas ni atributos de contexto preconfigurados para respaldar el contexto que hemos presentado. Para evaluar un ejemplo de solicitud de autorización con esta información contextual, realice las siguientes modificaciones en su almacén de políticas y en su solicitud de autorización. Para ver ejemplos de contexto con la información del token de acceso como contexto, consulte [Mapear los tokens de Amazon Cognito acceso y Mapear los tokens](cognito-map-token-to-schema.md#cognito-map-access-token) [de acceso del OIDC](oidc-map-token-to-schema.md#oidc-map-access-token).

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

Aplique las siguientes actualizaciones al esquema de su almacén de políticas para admitir los nuevos atributos de contexto. `GetOrder`Actualícelo de la `actions` siguiente manera.

```
"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 hacer referencia al tipo de `record` datos mencionado `NetworkInfo` en el contexto de la solicitud, cree una construcción [CommonType](https://docs.cedarpolicy.com/schema/schema.html#schema-commonTypes) en el esquema añadiendo anteriormente `actions` lo siguiente al esquema. Una `commonType` construcción es un conjunto compartido de atributos que se pueden aplicar a distintas entidades.

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

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

La siguiente política establece las condiciones que debe cumplir cada uno de los elementos de contexto proporcionados. Se basa en la política estática existente y se describe como **Customer Role: Get Order**. Inicialmente, esta política solo requiere que el principal que realiza una solicitud sea el propietario del 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*"
};
```

Ahora exigimos que la solicitud de recuperación de un pedido cumpla con las condiciones de contexto adicionales que añadimos a la solicitud.

1. El usuario debe haber iniciado sesión con MFA.

1. El navegador web del usuario `User-Agent` debe contener la cadena`My UserAgent`.

1. El usuario debe haber solicitado ver 4 pedidos o menos.

1. Uno de los códigos de cuenta del usuario debe ser`111122223333`.

1. La dirección IP del usuario debe tener su origen en los Estados Unidos, debe estar en una sesión cifrada y su dirección IP debe empezar por`192.0.2.`.

1. Un empleado debe haber aprobado su pedido. En el `entities` elemento de la solicitud de autorización, declararemos un usuario `Bob` que tiene la función de`Employee`.

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

Tras configurar el almacén de políticas con el esquema y la política adecuados, puede presentar esta solicitud de autorización a la operación de la API de permisos verificados [IsAuthorized](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_IsAuthorized.html). Tenga en cuenta que el `entities` segmento contiene una definición de `Bob` un usuario con un rol 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"
}
```

------