

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# コンテキストの追加
<a name="context"></a>

*コンテキスト*は、ポリシーの決定に関連する情報ですが、プリンシパル、アクション、またはリソースのアイデンティティの一部ではありません。アクセストークンクレームはコンテキストです。アクションは、ソース IP アドレスのセットからのみ、またはユーザーが MFA でサインインした場合にのみ許可できます。アプリケーションはこのコンテキストセッションデータにアクセスできるため、承認リクエストに入力する必要があります。Verified Permissions 認可リクエストのコンテキストデータは、 `contextMap`要素で JSON 形式である必要があります。

このコンテンツを説明する例は、[サンプルポリシーストア](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`値。この例では、 `true`のブール値 は、顧客が注文の表示をリクエストする前に多要素認証を実行した`MfaAuthenticated`ことを示します。

**設定**  
コンテキスト要素のコレクション。セットメンバーは、この例のようにすべて同じタイプにすることも、ネストされたセットを含む異なるタイプにすることもできます。この例では、顧客は 3 つの異なるアカウントに関連付けられています。

**String**  
文字で囲まれた文字、数字、または記号のシーケンス`"`。この例では、`UserAgent`文字列は、顧客が注文の表示をリクエストするために使用したブラウザを表します。

**Long**  
整数。この例では、 は、顧客が過去の 4 つの注文を表示するように求めた結果、このリクエストがバッチの一部である`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`のデータ型を参照するには、 の前にスキーマに以下を追加して、スキーマに [commonType](https://docs.cedarpolicy.com/schema/schema.html#schema-commonTypes) コンストラクトを作成します`actions`。`commonType` コンストラクトは、異なるエンティティに適用できる属性の共有セットです。

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

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

次のポリシーは、指定された各コンテキスト要素が満たす必要がある条件を設定します。既存の静的ポリシー上に、**Customer Role - Get Order **という説明が付けられています。このポリシーでは、最初は、リクエストを行うプリンシパルがリソースの所有者である必要があるだけです。

```
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. ユーザーのウェブブラウザには、文字列 が含まれている`User-Agent`必要があります`My UserAgent`。

1. ユーザーは 4 つ以下の注文を表示するようにリクエストしている必要があります。

1. ユーザーのアカウントコードの 1 つは である必要があります`111122223333`。

1. ユーザーの IP アドレスは米国を発信し、暗号化されたセッションにあり、IP アドレスは で始まる必要があります`192.0.2.`。

1. 従業員は注文を承認する必要があります。認可リクエストの `entities`要素で、 のロール`Bob`を持つユーザーを宣言します`Employee`。

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

適切なスキーマとポリシーを使用してポリシーストアを設定したら、この認可リクエストを Verified Permissions API オペレーション [IsAuthorized](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_IsAuthorized.html) に提示できます。`entities` セグメントには`Bob`、 というロールを持つユーザーである の定義が含まれていることに注意してください`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"
}
```

------