

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Menambahkan konteks
<a name="context"></a>

*Konteks* adalah informasi yang relevan dengan keputusan kebijakan, tetapi bukan bagian dari identitas kepala sekolah, tindakan, atau sumber daya Anda. Klaim token akses adalah konteks. Anda mungkin ingin mengizinkan tindakan hanya dari sekumpulan alamat IP sumber, atau hanya jika pengguna Anda telah masuk dengan MFA. Aplikasi Anda memiliki akses ke data sesi kontekstual ini dan harus mengisinya ke permintaan otorisasi. Data konteks dalam permintaan otorisasi Izin Terverifikasi harus diformat JSON dalam elemen. `contextMap`

Contoh yang menggambarkan konten ini berasal dari [toko kebijakan sampel](policy-stores-create.md). Untuk mengikuti, buat penyimpanan kebijakan **DigitalPetStore**sampel di lingkungan pengujian Anda.

Objek konteks berikut mendeklarasikan salah satu dari setiap tipe data Cedar untuk aplikasi berdasarkan penyimpanan **DigitalPetStore**kebijakan sampel.

```
"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"
    }
  }
}
```Tipe data dalam konteks otorisasi

**Boolean**  
Biner `true` atau `false` nilai. Dalam contoh, nilai boolean `true` for `MfaAuthenticated` menunjukkan bahwa pelanggan telah melakukan otentikasi multi-faktor sebelum meminta untuk melihat pesanan mereka.

**Set**  
Kumpulan elemen konteks. Anggota set bisa semua jenis yang sama, seperti dalam contoh ini, atau tipe yang berbeda, termasuk set bersarang. Dalam contoh, pelanggan dikaitkan dengan 3 akun berbeda.

**String**  
Urutan huruf, angka, atau simbol, terlampir dalam `"` karakter. Dalam contoh, `UserAgent` string mewakili browser yang digunakan pelanggan untuk meminta untuk melihat pesanan mereka.

**Panjang**  
Sebuah bilangan bulat. Dalam contoh, `RequestedOrderCount` menunjukkan bahwa permintaan ini adalah bagian dari batch yang dihasilkan dari pelanggan yang meminta untuk melihat empat pesanan mereka sebelumnya.

**Rekam**  
Kumpulan atribut. Anda harus mendeklarasikan atribut ini dalam konteks permintaan. Penyimpanan kebijakan dengan skema harus menyertakan entitas ini dan atribut entitas dalam skema. Dalam contoh, `NetworkInfo` catatan berisi informasi tentang IP asal pengguna, geolokasi IP tersebut sebagaimana ditentukan oleh klien, dan enkripsi dalam perjalanan.

**EntityIdentifier**  
Referensi ke entitas dan atribut yang dideklarasikan dalam `entities` elemen permintaan. Dalam contoh, pesanan pengguna disetujui oleh karyawan`Bob`.

Untuk menguji konteks contoh ini di **DigitalPetStore**aplikasi contoh, Anda harus memperbarui permintaan`entities`, skema penyimpanan kebijakan, dan kebijakan statis dengan deskripsi **Peran Pelanggan - Dapatkan Pesanan**.

## Memodifikasi DigitalPetStore untuk menerima konteks otorisasi
<a name="authorization-context-example"></a>

Awalnya, **DigitalPetStore**bukan toko kebijakan yang sangat kompleks. Itu tidak termasuk kebijakan atau atribut konteks yang telah dikonfigurasi sebelumnya untuk mendukung konteks yang telah kami sajikan. Untuk mengevaluasi contoh permintaan otorisasi dengan informasi konteks ini, lakukan modifikasi berikut pada toko kebijakan Anda dan permintaan otorisasi Anda. Untuk contoh konteks dengan informasi token akses sebagai konteksnya, lihat [Memetakan token Amazon Cognito akses dan Memetakan token akses](cognito-map-token-to-schema.md#cognito-map-access-token) [OIDC](oidc-map-token-to-schema.md#oidc-map-access-token).

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

Terapkan pembaruan berikut ke skema penyimpanan kebijakan Anda untuk mendukung atribut konteks baru. Perbarui `GetOrder` `actions` sebagai berikut.

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

Untuk mereferensikan tipe `record` data yang dinamai `NetworkInfo` dalam konteks permintaan Anda, buat konstruksi [CommonType](https://docs.cedarpolicy.com/schema/schema.html#schema-commonTypes) dalam skema Anda dengan menambahkan berikut ini ke skema Anda sebelumnya. `actions` `commonType`Konstruk adalah kumpulan atribut bersama yang dapat Anda terapkan ke entitas yang berbeda.

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

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

Kebijakan berikut menetapkan kondisi yang harus dipenuhi oleh masing-masing elemen konteks yang disediakan. Ini dibangun di atas kebijakan statis yang ada dengan deskripsi **Peran Pelanggan - Dapatkan Pesanan**. Kebijakan ini awalnya hanya mensyaratkan bahwa kepala sekolah yang membuat permintaan adalah pemilik sumber daya.

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

Kami sekarang mengharuskan permintaan untuk mengambil pesanan memenuhi kondisi konteks tambahan yang kami tambahkan ke permintaan.

1. Pengguna harus masuk dengan MFA.

1. Browser web pengguna `User-Agent` harus berisi string`My UserAgent`.

1. Pengguna harus meminta untuk melihat 4 atau lebih sedikit pesanan.

1. Salah satu kode akun pengguna harus`111122223333`.

1. Alamat IP pengguna harus berasal dari Amerika Serikat, mereka harus pada sesi terenkripsi, dan alamat IP mereka harus dimulai dengan. `192.0.2.`

1. Seorang karyawan harus menyetujui pesanan mereka. Dalam `entities` elemen permintaan otorisasi, kami akan mendeklarasikan pengguna `Bob` yang memiliki peran. `Employee`

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

Setelah mengonfigurasi penyimpanan kebijakan dengan skema dan kebijakan yang sesuai, Anda dapat menampilkan permintaan otorisasi ini ke operasi API Izin Terverifikasi. [IsAuthorized](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_IsAuthorized.html) Perhatikan bahwa `entities` segmen berisi definisi`Bob`, pengguna dengan peran`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"
}
```

------