View a markdown version of this page

Adicionando contexto - Amazon Verified Permissions

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

O contexto é a informação que é relevante para as decisões políticas, mas não faz parte da identidade do seu diretor, ação ou recurso. As reivindicações do token de acesso são contextuais. 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 estar JSON-formatted em um contextMap elemento.

Os exemplos que ilustram esse conteúdo vêm de um exemplo de repositório de políticas. 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 Cedar para um aplicativo com base no repositório de DigitalPetStore políticas de amostra.

"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 multifator 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 aos atributos declarados no entities elemento da solicitação. No exemplo, o pedido do usuário foi aprovado pelo funcionárioBob.

Para testar esse contexto de exemplo no DigitalPetStore aplicativo de exemplo, você deve atualizar sua solicitaçãoentities, 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

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 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 de acesso OIDC.

Schema

Aplique as seguintes atualizações ao esquema do seu 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 fazer referência ao tipo de record dados nomeado NetworkInfo em seu contexto de solicitação, crie uma construção commonType em seu esquema adicionando o seguinte ao seu esquema anteriormente. 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.

  2. O navegador da web do usuário User-Agent deve conter a stringMy UserAgent.

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

  4. Um dos códigos da conta do usuário deve ser111122223333.

  5. O endereço IP do usuário deve ser originário dos Estados Unidos, ele deve estar em uma sessão criptografada e seu endereço IP deve começar com192.0.2..

  6. 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 deEmployee.

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 da API de permissões verificadas. Observe que o entities segmento contém uma definição deBob, um usuário com uma função deEmployee.

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