Bagikan melalui


Tutorial: Mengembangkan dan merencanakan provisi untuk titik akhir SCIM di ID Microsoft Entra

Sebagai pengembang aplikasi, Anda dapat menggunakan API manajemen pengguna System for Cross-Domain Identity Management (SCIM) untuk mengaktifkan provisi otomatis pengguna dan grup antara aplikasi Anda dan ID Microsoft Entra. Artikel ini menjelaskan cara membangun titik akhir SCIM dan berintegrasi dengan layanan provisi Microsoft Entra. Spesifikasi SCIM menyediakan skema pengguna umum untuk provisi. Saat digunakan dengan standar federasi seperti SAML atau OpenID Connect, SCIM memberi administrator solusi berbasis standar end-to-end untuk manajemen akses.

Provisi dari ID Microsoft Entra ke aplikasi dengan SCIM

SCIM 2.0 adalah definisi standar dari dua titik akhir: /Users titik akhir dan /Groups titik akhir. Ini menggunakan titik akhir REST API umum untuk membuat, memperbarui, dan menghapus objek. SCIM terdiri dari skema yang telah ditentukan sebelumnya untuk atribut umum seperti nama grup, nama pengguna, nama depan, nama belakang, dan email.

Aplikasi yang menawarkan REST API SCIM 2.0 dapat mengurangi atau menghilangkan rasa sakit bekerja dengan API manajemen pengguna eksklusif. Misalnya, setiap klien SCIM yang patuh tahu cara membuat HTTP POST objek JSON ke /Users titik akhir untuk membuat entri pengguna baru. Alih-alih membutuhkan API yang sedikit berbeda untuk tindakan dasar yang sama, aplikasi yang sesuai dengan standar SCIM dapat langsung memanfaatkan klien, alat, dan kode yang sudah ada sebelumnya.

Skema objek pengguna standar dan API rest untuk manajemen yang ditentukan dalam SCIM 2.0 (RFC 7642, 7643, 7644) memungkinkan penyedia identitas dan aplikasi untuk lebih mudah berintegrasi satu sama lain. Pengembang aplikasi yang membangun titik akhir SCIM dapat berintegrasi dengan klien yang mematuhi SCIM tanpa harus melakukan pekerjaan kustom.

Untuk mengotomatiskan provisi ke aplikasi, perlu membangun dan mengintegrasikan titik akhir SCIM yang diakses oleh layanan provisi Microsoft Entra. Gunakan langkah-langkah berikut untuk mulai memprovisikan pengguna dan grup ke dalam aplikasi Anda.

  1. Rancang skema pengguna dan grup Anda - Identifikasi objek dan atribut aplikasi untuk menentukan bagaimana mereka memetakan ke skema pengguna dan grup yang didukung oleh implementasi Microsoft Entra SCIM.

  2. Pahami implementasi Microsoft Entra SCIM - Pahami bagaimana layanan provisi Microsoft Entra diterapkan untuk memodelkan penanganan dan respons permintaan protokol SCIM Anda.

  3. Bangun titik akhir SCIM - Titik akhir harus kompatibel dengan SCIM 2.0 untuk diintegrasikan dengan layanan provisi Microsoft Entra. Sebagai opsi, gunakan pustaka Microsoft Common Language Infrastructure (CLI) dan sampel kode untuk membangun titik akhir Anda. Sampel ini hanya untuk referensi dan pengujian; sebaiknya jangan menggunakannya sebagai dependensi di aplikasi produksi Anda.

  4. Integrasikan titik akhir SCIM Anda dengan layanan provisi Microsoft Entra. MICROSOFT Entra ID mendukung beberapa aplikasi pihak ketiga yang mengimplementasikan SCIM 2.0. Jika Anda menggunakan salah satu aplikasi ini, maka Anda dapat dengan cepat mengotomatiskan provisi dan deprovisi pengguna dan grup.

  5. [Opsional] Terbitkan aplikasi Anda ke galeri aplikasi Microsoft Entra - Memudahkan pelanggan untuk menemukan aplikasi Anda dan dengan mudah mengonfigurasi provisi.

Diagram yang memperlihatkan langkah-langkah yang diperlukan untuk mengintegrasikan titik akhir SCIM dengan ID Microsoft Entra.

Mendesain skema pengguna dan grup Anda

Setiap aplikasi memerlukan atribut yang berbeda untuk membuat pengguna atau grup. Mulai integrasi Anda dengan mengidentifikasi objek yang diperlukan (pengguna, grup) dan atribut (nama, manajer, jabatan, dan sebagainya) yang dibutuhkan aplikasi Anda.

Standar SCIM mendefinisikan skema untuk mengelola pengguna dan grup.

Skema pengguna inti hanya memerlukan tiga atribut (semua atribut lainnya bersifat opsional):

  • id, pengidentifikasi yang ditentukan penyedia layanan
  • userName, pengidentifikasi unik untuk pengguna (umumnya memetakan ke nama prinsipal pengguna Microsoft Entra)
  • meta, metadata baca-saja yang dikelola oleh penyedia layanan

Selain skema pengguna inti , standar SCIM mendefinisikan ekstensi pengguna perusahaan dengan model untuk memperluas skema pengguna untuk memenuhi kebutuhan aplikasi Anda.

Misalnya, jika aplikasi Anda memerlukan email pengguna dan manajer pengguna, gunakan skema inti untuk mengumpulkan email pengguna dan skema pengguna perusahaan untuk mengumpulkan manajer pengguna.

Untuk merancang skema Anda, ikuti langkah-langkah berikut:

  1. Cantumkan atribut yang diperlukan aplikasi Anda, lalu kategorikan sebagai atribut yang diperlukan untuk autentikasi (misalnya, loginName dan email). Atribut diperlukan untuk mengelola siklus hidup pengguna (misalnya, status /aktif), dan semua atribut lain yang diperlukan agar aplikasi berfungsi (misalnya, manajer, tag).

  2. Periksa apakah atribut sudah ditentukan dalam skema pengguna inti atau skema pengguna perusahaan . Jika tidak, Anda harus menentukan ekstensi ke skema pengguna yang mencakup atribut yang hilang. Lihat contoh ekstensi kepada pengguna untuk mengizinkan provisi pengguna tag.

  3. Petakan atribut SCIM ke atribut pengguna di MICROSOFT Entra ID. Jika salah satu atribut yang telah Anda tentukan di titik akhir SCIM Anda tidak memiliki mitra yang jelas pada skema pengguna Microsoft Entra, pandu administrator penyewa untuk memperluas skema mereka, atau menggunakan atribut ekstensi seperti yang ditunjukkan dalam contoh untuk tags properti .

Tabel berikut ini mencantumkan contoh atribut yang diperlukan:

Atribut/contoh aplikasi yang diperlukan Atribut SCIM yang dipetakan Atribut Microsoft Entra yang Dipetakan
loginName userName userPrincipalName
firstName name.givenName givenName
lastName name.familyName nama keluarga
workMail emails[type eq "work"].value Pos
manajer manajer manajer
tag urn:ietf:params:scim:schemas:extension:CustomExtensionName:2.0:User:tag extensionAttribute1
keadaan aktif isSoftDeleted (nilai komputasi tidak disimpan pada pengguna)

Payload JSON berikut menunjukkan contoh skema SCIM:

{
     "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User",
      "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User",
      "urn:ietf:params:scim:schemas:extension:CustomExtensionName:2.0:User"],
     "userName":"bjensen@testuser.com",
     "id": "48af03ac28ad4fb88478",
     "externalId":"bjensen",
     "name":{
       "familyName":"Jensen",
       "givenName":"Barbara"
     },
     "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User": {
     "manager": "123456"
   },
     "urn:ietf:params:scim:schemas:extension:CustomExtensionName:2.0:User": {
     "tag": "701984",
   },
   "meta": {
     "resourceType": "User",
     "created": "2010-01-23T04:56:22Z",
     "lastModified": "2011-05-13T04:42:34Z",
     "version": "W\/\"3694e05e9dff591\"",
     "location":
 "https://example.com/v2/Users/00aa00aa-bb11-cc22-dd33-44ee44ee44ee"
   }
}   

Nota

Selain atribut yang diperlukan untuk aplikasi, representasi JSON juga mencakup atribut , , externalIddan meta yang diperlukanid.

Ini membantu mengategorikan antara /User dan /Group untuk memetakan atribut pengguna default apa pun di MICROSOFT Entra ID ke SCIM RFC, lihat bagaimana menyesuaikan atribut dipetakan antara ID Microsoft Entra dan titik akhir SCIM Anda.

Tabel berikut ini mencantumkan contoh atribut pengguna:

Pengguna Microsoft Entra urn:ietf:params:scim:schemas:extension:enterprise:2.0:User
IsSoftDeleted aktif
departemen urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:department
displayName displayName
employeeId urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:employeeNumber
Facsimile-TelephoneNumber phoneNumbers[type eq "fax"].value
givenName name.givenName
jobTitle titel
pos emails[type eq "work"].value
mailNickname externalId
manajer urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:manager
telepon selular phoneNumbers[type eq "mobile"].value
postalCode addresses[type eq "work"].postalCode
alamat proksi emails[type eq "other"]. Nilai
physical-Delivery-OfficeName addresses[type eq "other"]. Diformat
streetAddress addresses[type eq "work"].streetAddress
nama keluarga name.familyName
nomor telepon phoneNumbers[type eq "work"].value
user-PrincipalName userName

Tabel berikut ini mencantumkan contoh atribut grup:

Grup Microsoft Entra urn:ietf:params:scim:schemas:core:2.0:Group
displayName displayName
anggota anggota
objectId externalId

Nota

Anda tidak diharuskan untuk mendukung pengguna dan grup, atau semua atribut yang ditampilkan di sini, itu hanya referensi tentang bagaimana atribut di ID Microsoft Entra sering dipetakan ke properti dalam protokol SCIM.

Ada beberapa titik akhir yang ditentukan dalam SCIM RFC. Anda dapat memulai dengan /User titik akhir lalu memperluas dari sana. Tabel berikut ini mencantumkan beberapa titik akhir SCIM:

Endpoint Deskripsi
/Pengguna Lakukan operasi CRUD pada objek pengguna.
/Kelompok Lakukan operasi CRUD pada objek grup.
/Skema Set atribut yang didukung oleh setiap klien dan penyedia layanan dapat bervariasi. Satu penyedia layanan mungkin mencakup name, , titledan emails, sementara penyedia layanan lain menggunakan name, title, dan phoneNumbers. Titik akhir skema memungkinkan penemuan atribut yang didukung.
/Massal Operasi massal memungkinkan Anda melakukan operasi pada kumpulan besar objek sumber daya dalam satu operasi (misalnya, memperbarui keanggotaan untuk grup besar).
/ServiceProviderConfig Menyediakan detail tentang fitur standar SCIM yang didukung, misalnya, sumber daya yang didukung dan metode autentikasi.
/ResourceTypes Menentukan metadata tentang setiap sumber daya.

Nota

/Schemas Gunakan titik akhir untuk mendukung atribut kustom atau jika skema Anda sering berubah karena memungkinkan klien untuk mengambil skema terbaru secara otomatis. /Bulk Gunakan titik akhir untuk mendukung grup.

Memahami implementasi Microsoft Entra SCIM

Layanan provisi Microsoft Entra dirancang untuk mendukung API manajemen pengguna SCIM 2.0.

Penting

Perilaku implementasi Microsoft Entra SCIM terakhir diperbarui pada 18 Desember 2018. Untuk informasi tentang apa yang berubah, lihat Kepatuhan protokol SCIM 2.0 dari layanan provisi pengguna Microsoft Entra.

Dalam spesifikasi protokol SCIM 2.0, aplikasi Anda harus mendukung persyaratan ini:

Syarat Catatan referensi (protokol SCIM)
Membuat pengguna, dan secara opsional juga mengelompokkan Bagian 3.3
Mengubah pengguna atau grup dengan permintaan PATCH Bagian 3.5.2. Mendukung memastikan bahwa grup dan pengguna disediakan dengan cara yang berkinerja.
Mengambil sumber daya yang diketahui untuk pengguna atau grup yang dibuat sebelumnya Bagian 3.4.1
Mengkueri pengguna atau grup Bagian 3.4.2. Secara default, pengguna diambil dengan mereka id dan dikueri dengan grup dan externalId, dan mereka username dikueri dengan displayName.
Filter excludedAttributes=members saat mengkueri sumber daya grup Bagian 3.4.2.2
Mendukung daftar pengguna dan paginating Bagian 3.4.2.4.
Menghapus sementara pengguna active=false dan memulihkan pengguna active=true Objek pengguna harus dikembalikan dalam permintaan apakah pengguna aktif atau tidak. Satu-satunya waktu pengguna tidak boleh dikembalikan adalah ketika dihapus secara permanen dari aplikasi.
Mendukung titik akhir /Skema Bagian 7 Titik akhir penemuan skema digunakan untuk menemukan lebih banyak atribut.
Terima token pembawa tunggal untuk autentikasi dan otorisasi ID Microsoft Entra ke aplikasi Anda.

Gunakan panduan umum saat menerapkan titik akhir SCIM untuk memastikan kompatibilitas dengan ID Microsoft Entra:

Umum:

  • id adalah properti yang diperlukan untuk semua sumber daya. Setiap respons yang mengembalikan sumber daya harus memastikan setiap sumber daya memiliki properti ini, kecuali ListResponse dengan elemen nol.
  • Nilai yang dikirim harus disimpan dalam format yang sama dengan yang dikirim. Nilai yang tidak valid harus ditolak dengan pesan kesalahan yang deskriptif dan dapat ditindaklanjuti. Transformasi data tidak boleh terjadi antara data dari ID Microsoft Entra dan data yang disimpan dalam aplikasi SCIM. (misalnya. Nomor telepon yang dikirim sebagai 55555555555 tidak boleh disimpan/dikembalikan sebagai +5 (555) 555-5555)
  • Tidak perlu menyertakan seluruh sumber daya dalam respons PATCH .
  • Tidak memerlukan kecocokan peka huruf besar/kecil pada elemen struktural di SCIM, khususnya nilai operasi PATCHop, seperti yang didefinisikan dalam bagian 3.5.2. MICROSOFT Entra ID memancarkan op nilai sebagai Tambahkan, Ganti, dan Hapus.
  • ID Microsoft Entra membuat permintaan untuk mengambil pengguna dan grup acak untuk memastikan bahwa titik akhir dan kredensial valid. Ini juga dilakukan sebagai bagian dari alur Uji Koneksi .
  • Mendukung HTTPS di titik akhir SCIM Anda.
  • Atribut kompleks dan multinim kustom didukung tetapi ID Microsoft Entra tidak memiliki banyak struktur data kompleks untuk menarik data dari dalam kasus ini. Atribut nama/nilai dapat dipetakan ke dengan mudah, tetapi mengalirkan data ke atribut kompleks dengan tiga subatribut atau lebih tidak didukung.
  • Nilai subatribute "jenis" dari atribut kompleks multinilai harus unik. Misalnya, tidak boleh ada dua alamat email yang berbeda dengan subjenis "kerja".
  • Header untuk semua respons harus berjenis konten: application/scim+json

Mengambil Sumber Daya:

  • Respons terhadap permintaan kueri/filter harus selalu berupa ListResponse.
  • Microsoft Entra-only menggunakan operator berikut: eq, and
  • Atribut tempat sumber daya dapat dikueri harus ditetapkan sebagai atribut yang cocok pada aplikasi, lihat Menyesuaikan Pemetaan Atribut Provisi Pengguna.

/Pengguna:

  • Atribut pemberian izin tidak didukung.
  • Atribut apa pun yang dianggap untuk keunikan pengguna harus dapat digunakan sebagai bagian dari kueri yang difilter. (misalnya, jika keunikan pengguna dievaluasi untuk userName dan email[type eq "work"], GET ke /Users dengan filter harus mengizinkan userName eq "user@contoso.com" dan emails[type eq "work"].value eq "user@contoso.com" queries.

/Kelompok:

  • Grup bersifat opsional, tetapi hanya didukung jika implementasi SCIM mendukung permintaan PATCH .
  • Grup harus memiliki keunikan pada nilai 'displayName' agar cocok dengan ID Microsoft Entra dan aplikasi SCIM. Keunikan bukanlah persyaratan protokol SCIM, tetapi merupakan persyaratan untuk mengintegrasikan titik akhir SCIM dengan ID Microsoft Entra.

/Skema (Penemuan skema):

  • Sampel permintaan/respons
  • Penemuan skema sedang digunakan pada aplikasi galeri tertentu. Penemuan skema adalah metode satu-satunya untuk menambahkan lebih banyak atribut ke skema aplikasi SCIM galeri yang ada. Penemuan skema saat ini tidak didukung pada aplikasi SCIM non-galeri kustom.
  • Jika nilai tidak ada, jangan kirim nilai null.
  • Nilai properti harus kasing unta (misalnya, readWrite).
  • Harus mengembalikan respons daftar.
  • Layanan provisi Microsoft Entra membuat permintaan /skema saat Anda menyimpan konfigurasi provisi. Permintaan juga dibuat saat Anda membuka halaman edit provisi. Atribut lain yang ditemukan muncul ke pelanggan dalam pemetaan atribut di bawah daftar atribut target. Penemuan skema hanya menyebabkan lebih banyak atribut target ditambahkan. Atribut tidak dihapus.

Provisi dan deprovisi pengguna

Diagram berikut menunjukkan pesan yang dikirim ID Microsoft Entra ke titik akhir SCIM untuk mengelola siklus hidup pengguna di penyimpanan identitas aplikasi Anda.

Diagram yang memperlihatkan urutan deprovisi pengguna.

Provisi dan deprovisi grup

Provisi dan deprovisi grup bersifat opsional. Saat diimplementasikan dan diaktifkan, ilustrasi berikut menunjukkan pesan yang dikirim ID Microsoft Entra ke titik akhir SCIM untuk mengelola siklus hidup grup di penyimpanan identitas aplikasi Anda. Pesan tersebut berbeda dari pesan tentang pengguna dengan dua cara:

  • Permintaan untuk mengambil grup menentukan bahwa atribut anggota akan dikecualikan dari sumber daya apa pun yang disediakan sebagai respons terhadap permintaan.
  • Permintaan untuk menentukan apakah atribut referensi memiliki nilai tertentu adalah permintaan tentang atribut anggota.

Diagram berikut menunjukkan urutan deprovisi grup:

Diagram yang memperlihatkan urutan deprovisi grup.

Permintaan dan respons protokol SCIM

Artikel ini menyediakan contoh permintaan SCIM yang dikeluarkan oleh layanan provisi Microsoft Entra dan contoh respons yang diharapkan. Untuk hasil terbaik, Anda harus membuat kode aplikasi untuk menangani permintaan ini dalam format ini dan memancarkan respons yang diharapkan.

Penting

Untuk memahami bagaimana dan kapan layanan provisi pengguna Microsoft Entra memancarkan operasi yang dijelaskan dalam contoh, lihat bagian Siklus provisi: Awal dan bertahap dalam Cara kerja provisi.

Operasi Pengguna

Operasi Grup

Penemuan skema

Operasi Pengguna

  • Gunakan userName atau emails[type eq "work"] atribut untuk mengkueri pengguna.

Buat Pengguna

Minta

POST /Users

{
    "schemas": [
        "urn:ietf:params:scim:schemas:core:2.0:User",
        "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"],
    "externalId": "0a21f0f2-8d2a-4f8e-bf98-7363c4aed4ef",
    "userName": "Test_User_00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
    "active": true,
    "emails": [{
        "primary": true,
        "type": "work",
        "value": "Test_User_11bb11bb-cc22-dd33-ee44-55ff55ff55ff@testuser.com"
    }],
    "meta": {
        "resourceType": "User"
    },
    "name": {
        "formatted": "givenName familyName",
        "familyName": "familyName",
        "givenName": "givenName"
    },
    "roles": []
}
Jawaban

HTTP/1.1 201 Dibuat

{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
    "id": "48af03ac28ad4fb88478",
    "externalId": "0a21f0f2-8d2a-4f8e-bf98-7363c4aed4ef",
    "meta": {
        "resourceType": "User",
        "created": "2018-03-27T19:59:26.000Z",
        "lastModified": "2018-03-27T19:59:26.000Z"
    },
    "userName": "Test_User_00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
    "name": {
        "formatted": "givenName familyName",
        "familyName": "familyName",
        "givenName": "givenName",
    },
    "active": true,
    "emails": [{
        "value": "Test_User_11bb11bb-cc22-dd33-ee44-55ff55ff55ff@testuser.com",
        "type": "work",
        "primary": true
    }]
}

Dapatkan Pengguna

Minta

GET /Users/5d48a0a8e9f04aa38008

Respons (Pengguna ditemukan)

HTTP/1.1 200 OK

{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
    "id": "5d48a0a8e9f04aa38008",
    "externalId": "58342554-38d6-4ec8-948c-50044d0a33fd",
    "meta": {
        "resourceType": "User",
        "created": "2018-03-27T19:59:26.000Z",
        "lastModified": "2018-03-27T19:59:26.000Z"
    },
    "userName": "Test_User_00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
    "name": {
        "formatted": "givenName familyName",
        "familyName": "familyName",
        "givenName": "givenName",
    },
    "active": true,
    "emails": [{
        "value": "Test_User_11bb11bb-cc22-dd33-ee44-55ff55ff55ff@testuser.com",
        "type": "work",
        "primary": true
    }]
}
Minta

GET /Users/5171a35d82074e068ce2

Respons (Pengguna tidak ditemukan. Detail tidak diperlukan, hanya status.)

HTTP/1.1 404 Tidak Ditemukan

{
    "schemas": [
        "urn:ietf:params:scim:api:messages:2.0:Error"
    ],
    "status": "404",
    "detail": "Resource 23B51B0E5D7AE9110A49411D@7cca31655d49f3640a494224 not found"
}

Dapatkan Pengguna menurut kueri

Minta

GET /Users?filter=userName eq "Test_User_00aa00aa-bb11-cc22-dd33-44ee44ee44ee"

Jawaban

HTTP/1.1 200 OK

{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
    "totalResults": 1,
    "Resources": [{
        "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
        "id": "2441309d85324e7793ae",
        "externalId": "7fce0092-d52e-4f76-b727-3955bd72c939",
        "meta": {
            "resourceType": "User",
            "created": "2018-03-27T19:59:26.000Z",
            "lastModified": "2018-03-27T19:59:26.000Z"
            
        },
        "userName": "Test_User_00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
        "name": {
            "familyName": "familyName",
            "givenName": "givenName"
        },
        "active": true,
        "emails": [{
            "value": "Test_User_11bb11bb-cc22-dd33-ee44-55ff55ff55ff@testuser.com",
            "type": "work",
            "primary": true
        }]
    }],
    "startIndex": 1,
    "itemsPerPage": 20
}

Dapatkan Pengguna menurut kueri - Hasil nol

Minta

GET /Users?filter=userName eq "non-existent user"

Jawaban

HTTP/1.1 200 OK

{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
    "totalResults": 0,
    "Resources": [],
    "startIndex": 1,
    "itemsPerPage": 20
}

Perbarui Pengguna [Properti multinilai]

Minta

PATCH /Users/6764549bef60420686bc HTTP/1.1

{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
    "Operations": [
            {
            "op": "Replace",
            "path": "emails[type eq \"work\"].value",
            "value": "updatedEmail@microsoft.com"
            },
            {
            "op": "Replace",
            "path": "name.familyName",
            "value": "updatedFamilyName"
            }
    ]
}
Jawaban

HTTP/1.1 200 OK

{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
    "id": "6764549bef60420686bc",
    "externalId": "6c75de36-30fa-4d2d-a196-6bdcdb6b6539",
    "meta": {
        "resourceType": "User",
        "created": "2018-03-27T19:59:26.000Z",
        "lastModified": "2018-03-27T19:59:26.000Z"
    },
    "userName": "Test_User_00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
    "name": {
        "formatted": "givenName updatedFamilyName",
        "familyName": "updatedFamilyName",
        "givenName": "givenName"
    },
    "active": true,
    "emails": [{
        "value": "updatedEmail@microsoft.com",
        "type": "work",
        "primary": true
    }]
}

Perbarui Pengguna [Properti bernilai tunggal]

Minta

PATCH /Users/5171a35d82074e068ce2 HTTP/1.1

{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
    "Operations": [{
        "op": "Replace",
        "path": "userName",
        "value": "5b50642d-79fc-4410-9e90-4c077cdd1a59@testuser.com"
    }]
}
Jawaban

HTTP/1.1 200 OK

{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
    "id": "5171a35d82074e068ce2",
    "externalId": "aa1eca08-7179-4eeb-a0be-a519f7e5cd1a",
    "meta": {
        "resourceType": "User",
        "created": "2018-03-27T19:59:26.000Z",
        "lastModified": "2018-03-27T19:59:26.000Z"
        
    },
    "userName": "5b50642d-79fc-4410-9e90-4c077cdd1a59@testuser.com",
    "name": {
        "formatted": "givenName familyName",
        "familyName": "familyName",
        "givenName": "givenName",
    },
    "active": true,
    "emails": [{
        "value": "Test_User_11bb11bb-cc22-dd33-ee44-55ff55ff55ff@testuser.com",
        "type": "work",
        "primary": true
    }]
}

Nonaktifkan Pengguna

Minta

PATCH /Users/5171a35d82074e068ce2 HTTP/1.1

{
    "Operations": [
        {
            "op": "Replace",
            "path": "active",
            "value": false
        }
    ],
    "schemas": [
        "urn:ietf:params:scim:api:messages:2.0:PatchOp"
    ]
}
Jawaban
{
    "schemas": [
        "urn:ietf:params:scim:schemas:core:2.0:User"
    ],
    "id": "CEC50F275D83C4530A495FCF@834d0e1e5d8235f90a495fda",
    "userName": "deanruiz@testuser.com",
    "name": {
        "familyName": "Harris",
        "givenName": "Larry"
    },
    "active": false,
    "emails": [
        {
            "value": "gloversuzanne@testuser.com",
            "type": "work",
            "primary": true
        }
    ],
    "addresses": [
        {
            "country": "ML",
            "type": "work",
            "primary": true
        }
    ],
    "meta": {
        "resourceType": "Users",
        "location": "/scim/5171a35d82074e068ce2/Users/CEC50F265D83B4530B495FCF@5171a35d82074e068ce2"
    }
}

Hapus Pengguna

Minta

DELETE /Users/5171a35d82074e068ce2 HTTP/1.1

Jawaban

HTTP/1.1 204 Tanpa Konten

Operasi Grup

  • Grup dibuat dengan daftar anggota kosong.
  • displayName Gunakan atribut untuk mengkueri grup.
  • Pembaruan pada permintaan PATCH grup harus menghasilkan HTTP 204 Tanpa Konten dalam respons. Mengembalikan isi dengan daftar semua anggota tidak disarankan.
  • Tidak perlu mendukung pengembalian semua anggota grup.

Buat Grup

Minta

POST /Groups HTTP/1.1

{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group", "http://schemas.microsoft.com/2006/11/ResourceManagement/ADSCIM/2.0/Group"],
    "externalId": "8aa1a0c0-c4c3-4bc0-b4a5-2ef676900159",
    "displayName": "displayName",
    "meta": {
        "resourceType": "Group"
    }
}
Jawaban

HTTP/1.1 201 Dibuat

{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
    "id": "927fa2c08dcb4a7fae9e",
    "externalId": "8aa1a0c0-c4c3-4bc0-b4a5-2ef676900159",
    "meta": {
        "resourceType": "Group",
        "created": "2018-03-27T19:59:26.000Z",
        "lastModified": "2018-03-27T19:59:26.000Z"
        
    },
    "displayName": "displayName",
    "members": []
}

Dapatkan Grup

Minta

GET /Groups/40734ae655284ad3abcc?excludedAttributes=members HTTP/1.1

Jawaban

HTTP/1.1 200 OK

{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
    "id": "40734ae655284ad3abcc",
    "externalId": "60f1bb27-2e1e-402d-bcc4-ec999564a194",
    "meta": {
        "resourceType": "Group",
        "created": "2018-03-27T19:59:26.000Z",
        "lastModified": "2018-03-27T19:59:26.000Z"
    },
    "displayName": "displayName",
}

Dapatkan Grup menurut displayName

Minta

GET /Groups?excludedAttributes=members&filter=displayName eq "displayName" HTTP/1.1

Jawaban

HTTP/1.1 200 OK

{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
    "totalResults": 1,
    "Resources": [{
        "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
        "id": "8c601452cc934a9ebef9",
        "externalId": "0db508eb-91e2-46e4-809c-30dcbda0c685",
        "meta": {
            "resourceType": "Group",
            "created": "2018-03-27T22:02:32.000Z",
            "lastModified": "2018-03-27T22:02:32.000Z",
            
        },
        "displayName": "displayName",
    }],
    "startIndex": 1,
    "itemsPerPage": 20
}

Perbarui Grup [Atribut non-anggota]

Minta

PATCH /Groups/fa2ce26709934589afc5 HTTP/1.1

{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
    "Operations": [{
        "op": "Replace",
        "path": "displayName",
        "value": "1879db59-3bdf-4490-ad68-ab880a269474updatedDisplayName"
    }]
}
Jawaban

HTTP/1.1 204 Tanpa Konten

Perbarui Grup [Tambahkan Anggota]

Minta

PATCH /Groups/a99962b9f99d4c4fac67 HTTP/1.1

{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
    "Operations": [{
        "op": "Add",
        "path": "members",
        "value": [{
            "$ref": null,
            "value": "f648f8d5ea4e4cd38e9c"
        }]
    }]
}
Jawaban

HTTP/1.1 204 Tanpa Konten

Perbarui Grup [Hapus Anggota]

Minta

PATCH /Groups/a99962b9f99d4c4fac67 HTTP/1.1

{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
    "Operations": [{
        "op": "Remove",
        "path": "members",
        "value": [{
            "$ref": null,
            "value": "f648f8d5ea4e4cd38e9c"
        }]
    }]
}
Jawaban

HTTP/1.1 204 Tanpa Konten

Hapus Grup

Minta

DELETE /Groups/cdb1ce18f65944079d37 HTTP/1.1

Jawaban

HTTP/1.1 204 Tanpa Konten

Penemuan skema

Menemukan skema

Minta

GET /Schemas

Jawaban

HTTP/1.1 200 OK

{
    "schemas": [
        "urn:ietf:params:scim:api:messages:2.0:ListResponse"
    ],
    "itemsPerPage": 50,
    "startIndex": 1,
    "totalResults": 3,
    "Resources": [
  {
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Schema"],
    "id" : "urn:ietf:params:scim:schemas:core:2.0:User",
    "name" : "User",
    "description" : "User Account",
    "attributes" : [
      {
        "name" : "userName",
        "type" : "string",
        "multiValued" : false,
        "description" : "Unique identifier for the User, typically
used by the user to directly authenticate to the service provider.
Each User MUST include a non-empty userName value.  This identifier
MUST be unique across the service provider's entire set of Users.
REQUIRED.",
        "required" : true,
        "caseExact" : false,
        "mutability" : "readWrite",
        "returned" : "default",
        "uniqueness" : "server"
      },                
    ],
    "meta" : {
      "resourceType" : "Schema",
      "location" :
        "/v2/Schemas/urn:ietf:params:scim:schemas:core:2.0:User"
    }
  },
  {
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Schema"],
    "id" : "urn:ietf:params:scim:schemas:core:2.0:Group",
    "name" : "Group",
    "description" : "Group",
    "attributes" : [
      {
        "name" : "displayName",
        "type" : "string",
        "multiValued" : false,
        "description" : "A human-readable name for the Group.
REQUIRED.",
        "required" : false,
        "caseExact" : false,
        "mutability" : "readWrite",
        "returned" : "default",
        "uniqueness" : "none"
      },
    ],
    "meta" : {
      "resourceType" : "Schema",
      "location" :
        "/v2/Schemas/urn:ietf:params:scim:schemas:core:2.0:Group"
    }
  },
  {
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Schema"],
    "id" : "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User",
    "name" : "EnterpriseUser",
    "description" : "Enterprise User",
    "attributes" : [
      {
        "name" : "employeeNumber",
        "type" : "string",
        "multiValued" : false,
        "description" : "Numeric or alphanumeric identifier assigned
to a person, typically based on order of hire or association with an
organization.",
        "required" : false,
        "caseExact" : false,
        "mutability" : "readWrite",
        "returned" : "default",
        "uniqueness" : "none"
      },
    ],
    "meta" : {
      "resourceType" : "Schema",
      "location" :
"/v2/Schemas/urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"
    }
  }
]
}

Persyaratan keamanan

Versi Protokol TLS

Satu-satunya versi protokol yang dapat diterima adalah TLS 1.2. Tidak ada versi SSL/TLS lain yang diizinkan.

  • Kunci RSA harus minimal 2.048 bit.
  • Kunci ECC harus setidaknya 256 bit, dihasilkan menggunakan kurva elips yang disetujui

Panjang Kunci

Semua layanan harus menggunakan sertifikat X.509 yang dihasilkan menggunakan kunci kriptografi dengan panjang yang cukup, yang berarti:

Suite Cipher

Semua layanan harus dikonfigurasi untuk menggunakan cipher suite berikut, dalam urutan yang tepat yang ditentukan dalam contoh. Jika Anda hanya memiliki sertifikat RSA, suite sandi ECDSA yang diinstal tidak berpengaruh apa pun.

Bilah minimum TLS 1.2 Cipher Suites:

  • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384

Rentang IP

Layanan provisi Microsoft Entra saat ini beroperasi di bawah Rentang IP untuk ID Microsoft Entra seperti yang tercantum di sini. Anda dapat menambahkan rentang IP yang tercantum di bawah AzureActiveDirectory tag untuk mengizinkan lalu lintas dari layanan provisi Microsoft Entra ke dalam aplikasi Anda. Anda perlu meninjau daftar rentang IP dengan hati-hati untuk alamat komputasi. Alamat seperti '40.126.25.32' dapat diwakili dalam daftar rentang IP sebagai '40.126.0.0/18'. Anda juga dapat mengambil daftar rentang IP secara terprogram menggunakan API berikut.

MICROSOFT Entra ID juga mendukung solusi berbasis agen untuk menyediakan konektivitas ke aplikasi di jaringan privat (lokal, dihosting di Azure, dihosting di AWS, dan sebagainya). Pelanggan dapat menyebarkan agen ringan, yang menyediakan konektivitas ke ID Microsoft Entra tanpa membuka port masuk apa pun, di server di jaringan privat mereka. Pelajari selengkapnya di sini.

Membangun titik akhir SCIM

Sekarang setelah Anda merancang skema dan memahami implementasi Microsoft Entra SCIM, Anda dapat mulai mengembangkan titik akhir SCIM Anda. Daripada memulai dari awal dan membangun implementasi sepenuhnya sendiri, Anda dapat mengandalkan banyak pustaka SCIM sumber terbuka yang diterbitkan oleh komunitas SCIM.

Untuk panduan tentang cara membangun titik akhir SCIM termasuk contoh, lihat Mengembangkan sampel titik akhir SCIM.

Contoh kode referensi .NET Core sumber terbuka yang diterbitkan oleh tim provisi Microsoft Entra adalah salah satu sumber daya seperti itu yang dapat memulai pengembangan Anda. Buat titik akhir SCIM, lalu uji dengan menjalankan permintaan/respons sampel yang disediakan.

Nota

Kode referensi dimaksudkan untuk membantu Anda mulai membangun titik akhir SCIM Anda dan disediakan "APA ADANYA." Kontribusi dari komunitas dipersilakan untuk membantu membangun dan memelihara kode.

Solusi ini terdiri dari dua proyek, Microsoft.SCIM dan Microsoft.SCIM.WebHostSample.

Proyek Microsoft.SCIM adalah pustaka yang menentukan komponen layanan web yang sesuai dengan spesifikasi SCIM. Ini menyatakan antarmuka Microsoft.SCIM.IProvider, permintaan diterjemahkan ke dalam panggilan ke metode penyedia, yang akan diprogram untuk beroperasi di penyimpanan identitas.

Perincian: Permintaan yang diterjemahkan ke dalam panggilan ke metode penyedia

Proyek Microsoft.SCIM.WebHostSample adalah ASP.NET Core Web Application, berdasarkan templat Kosong . Ini memungkinkan kode sampel disebarkan sebagai mandiri, dihosting dalam kontainer atau dalam Layanan Informasi Internet. Ini juga mengimplementasikan antarmuka Microsoft.SCIM.IProvider yang menyimpan kelas dalam memori sebagai penyimpanan identitas sampel.

public class Startup
{
    ...
    public IMonitor MonitoringBehavior { get; set; }
    public IProvider ProviderBehavior { get; set; }

    public Startup(IWebHostEnvironment env, IConfiguration configuration)
    {
        ...
        this.MonitoringBehavior = new ConsoleMonitor();
        this.ProviderBehavior = new InMemoryProvider();
    }
    ...

Membangun titik akhir SCIM kustom

Titik akhir SCIM harus memiliki alamat HTTP dan sertifikat autentikasi server yang otoritas sertifikasi akarnya adalah salah satu nama berikut:

  • CNNIC
  • Comodo
  • CyberTrust
  • DigiCert
  • GeoTrust
  • GlobalSign
  • Pergi Ayah
  • VeriSign
  • WoSign
  • DST Root CA X3

.NET Core SDK menyertakan sertifikat pengembangan HTTPS yang digunakan selama pengembangan. Sertifikat diinstal sebagai bagian dari pengalaman eksekusi pertama. Bergantung pada cara Anda menjalankan Aplikasi Web ASP.NET Core yang didengarkannya ke port yang berbeda:

  • Microsoft.SCIM.WebHostSample: https://localhost:5001
  • IIS Express: https://localhost:44359

Untuk informasi selengkapnya tentang HTTPS di ASP.NET Core, gunakan tautan berikut: Menerapkan HTTPS di ASP.NET Core

Menangani autentikasi titik akhir

Permintaan dari layanan provisi Microsoft Entra mencakup token pembawa OAuth 2.0. Server otorisasi mengeluarkan token pembawa. ID Microsoft Entra adalah contoh server otorisasi tepercaya. Konfigurasikan layanan provisi Microsoft Entra untuk menggunakan salah satu token berikut:

  • Token pembawa berumur panjang. Jika titik akhir SCIM memerlukan token pembawa OAuth dari penerbit selain ID Microsoft Entra, salin token pembawa OAuth yang diperlukan ke bidang Token Rahasia opsional. Di lingkungan pengembangan, Anda dapat menggunakan token pengujian dari /scim/token titik akhir. Token pengujian tidak boleh digunakan di lingkungan produksi.

  • Token pembawa Microsoft Entra. Jika bidang Token Rahasia dibiarkan kosong, ID Microsoft Entra menyertakan token pembawa OAuth yang dikeluarkan dari ID Microsoft Entra dengan setiap permintaan. Aplikasi yang menggunakan ID Microsoft Entra sebagai idP dapat memvalidasi token yang dikeluarkan ID Microsoft Entra ini.

    • Aplikasi yang menerima permintaan harus memvalidasi penerbit token sebagai ID Microsoft Entra untuk penyewa Microsoft Entra yang diharapkan.
    • iss Klaim mengidentifikasi penerbit token. Misalnya, "iss":"https://sts.windows.net/aaaabbbb-0000-cccc-1111-dddd2222eeee/". Dalam contoh ini, alamat dasar nilai klaim, https://sts.windows.net mengidentifikasi ID Microsoft Entra sebagai penerbit, sementara segmen alamat relatif, aaaabbbb-0000-cc-1111-dddd2222eeee, adalah pengidentifikasi unik penyewa Microsoft Entra tempat token dikeluarkan.
    • Audiens untuk token adalah ID Aplikasi untuk aplikasi di galeri. Aplikasi yang terdaftar dalam satu penyewa menerima klaim yang sama iss dengan permintaan SCIM. ID aplikasi untuk semua aplikasi kustom adalah 8adf8e6e-67b2-4cf2-a259-e3dc5476c621. Token yang dihasilkan oleh ID Microsoft Entra hanya boleh digunakan untuk pengujian. Ini tidak boleh digunakan di lingkungan produksi.

Dalam kode sampel, permintaan diautentikasi menggunakan paket Microsoft.AspNetCore.Authentication.JwtBearer. Kode berikut memberlakukan bahwa permintaan ke salah satu titik akhir layanan diautentikasi menggunakan token pembawa yang dikeluarkan oleh ID Microsoft Entra untuk penyewa tertentu:

public void ConfigureServices(IServiceCollection services)
{
    if (_env.IsDevelopment())
    {
        ...
    }
    else
    {
        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
            .AddJwtBearer(options =>
            {
                options.Authority = " https://sts.windows.net/aaaabbbb-0000-cccc-1111-dddd2222eeee/";
                options.Audience = "8adf8e6e-67b2-4cf2-a259-e3dc5476c621";
                ...
            });
    }
    ...
}

public void Configure(IApplicationBuilder app)
{
    ...
    app.UseAuthentication();
    app.UseAuthorization();
    ...
}

Kode sampel menggunakan lingkungan ASP.NET Core untuk mengubah opsi autentikasi selama tahap pengembangan dan mengaktifkan penggunaan token yang ditandatangani sendiri.

Untuk informasi selengkapnya tentang beberapa lingkungan di ASP.NET Core, lihat Menggunakan beberapa lingkungan di ASP.NET Core.

Kode berikut memberlakukan bahwa permintaan ke salah satu titik akhir layanan diautentikasi menggunakan token pembawa yang ditandatangani dengan kunci kustom:

public void ConfigureServices(IServiceCollection services)
{
    if (_env.IsDevelopment())
    {
        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(options =>
        {
            options.TokenValidationParameters =
                new TokenValidationParameters
                {
                    ValidateIssuer = false,
                    ValidateAudience = false,
                    ValidateLifetime = false,
                    ValidateIssuerSigningKey = false,
                    ValidIssuer = "Microsoft.Security.Bearer",
                    ValidAudience = "Microsoft.Security.Bearer",
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("A1B2C3D4E5F6A1B2C3D4E5F6"))
                };
        });
    }
...

Kirim permintaan GET ke pengontrol Token untuk mendapatkan token pembawa yang valid, metode GenerateJSONWebToken bertanggung jawab untuk membuat token yang cocok dengan parameter yang dikonfigurasi untuk pengembangan:

private string GenerateJSONWebToken()
{
    // Create token key
    SymmetricSecurityKey securityKey =
        new SymmetricSecurityKey(Encoding.UTF8.GetBytes("A1B2C3D4E5F6A1B2C3D4E5F6"));
    SigningCredentials credentials =
        new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

    // Set token expiration
    DateTime startTime = DateTime.UtcNow;
    DateTime expiryTime = startTime.AddMinutes(120);

    // Generate the token
    JwtSecurityToken token =
        new JwtSecurityToken(
            "Microsoft.Security.Bearer",
            "Microsoft.Security.Bearer",
            null,
            notBefore: startTime,
            expires: expiryTime,
            signingCredentials: credentials);

    string result = new JwtSecurityTokenHandler().WriteToken(token);
    return result;
}

Menangani provisi dan deprovisi pengguna

Contoh 1. Mengkueri layanan untuk pengguna yang cocok

ID Microsoft Entra meminta layanan untuk pengguna dengan nilai atribut yang externalId cocok dengan nilai atribut mailNickname pengguna di ID Microsoft Entra. Kueri dinyatakan sebagai permintaan Hypertext Transfer Protocol (HTTP) seperti contoh ini, di mana jyoung adalah sampel mailNickname pengguna di ID Microsoft Entra.

Nota

Ini adalah contoh saja. Tidak semua pengguna akan memiliki atribut mailNickname, dan nilai yang dimiliki pengguna mungkin tidak unik dalam direktori. Selain itu, atribut yang digunakan untuk pencocokan (yang dalam hal externalIdini ) dapat dikonfigurasi dalam pemetaan atribut Microsoft Entra.

GET https://.../scim/Users?filter=externalId eq jyoung HTTP/1.1
 Authorization: Bearer ...

Dalam kode sampel, permintaan diterjemahkan ke dalam panggilan ke metode QueryAsync penyedia layanan. Berikut adalah tanda tangan metode itu:

// System.Threading.Tasks.Tasks is defined in mscorlib.dll.  
// Microsoft.SCIM.IRequest is defined in 
// Microsoft.SCIM.Service.  
// Microsoft.SCIM.Resource is defined in 
// Microsoft.SCIM.Schemas.  
// Microsoft.SCIM.IQueryParameters is defined in 
// Microsoft.SCIM.Protocol.  

Task<Resource[]> QueryAsync(IRequest<IQueryParameters> request);

Dalam kueri sampel, untuk pengguna dengan nilai tertentu untuk externalId atribut , nilai argumen yang diteruskan ke metode QueryAsync adalah:

  • Parameter. AlternateFilters.Count: 1
  • Parameter. AlternateFilters.ElementAt(0). AttributePath: "externalId"
  • Parameter. AlternateFilters.ElementAt(0). PerbandinganOperator: PerbandinganOperator.Equals
  • Parameter. AlternateFilter.ElementAt(0). Nilai Perbandingan: "jyoung"

Contoh 2. Memprovisikan pengguna

Jika respons terhadap kueri ke titik akhir SCIM untuk pengguna dengan nilai atribut yang cocok dengan externalId nilai atribut mailNickname pengguna tidak mengembalikan pengguna apa pun, maka ID Microsoft Entra meminta agar layanan menyediakan pengguna yang sesuai dengan yang ada di ID Microsoft Entra. Berikut adalah contoh permintaan seperti itu:

POST https://.../scim/Users HTTP/1.1
Authorization: Bearer ...
Content-type: application/scim+json
{
   "schemas":
   [
     "urn:ietf:params:scim:schemas:core:2.0:User",
     "urn:ietf:params:scim:schemas:extension:enterprise:2.0User"],
   "externalId":"jyoung",
   "userName":"jyoung@testuser.com",
   "active":true,
   "addresses":null,
   "displayName":"Joy Young",
   "emails": [
     {
       "type":"work",
       "value":"jyoung@Contoso.com",
       "primary":true}],
   "meta": {
     "resourceType":"User"},
    "name":{
     "familyName":"Young",
     "givenName":"Joy"},
   "phoneNumbers":null,
   "preferredLanguage":null,
   "title":null,
   "department":null,
   "manager":null}

Dalam kode sampel, permintaan diterjemahkan ke dalam panggilan ke metode CreateAsync penyedia layanan. Berikut adalah tanda tangan metode itu:

// System.Threading.Tasks.Tasks is defined in mscorlib.dll.  
// Microsoft.SCIM.IRequest is defined in 
// Microsoft.SCIM.Service.  
// Microsoft.SCIM.Resource is defined in 
// Microsoft.SCIM.Schemas.  

Task<Resource> CreateAsync(IRequest<Resource> request);

Dalam permintaan provisi pengguna, nilai argumen sumber daya adalah instans Microsoft.SCIM.Core2EnterpriseUser kelas . Kelas ini didefinisikan dalam Microsoft.SCIM.Schemas pustaka. Jika permintaan untuk memprovisikan pengguna berhasil, maka implementasi metode diharapkan mengembalikan instans Microsoft.SCIM.Core2EnterpriseUser kelas. Nilai Identifier properti diatur ke pengidentifikasi unik pengguna yang baru disediakan.

Contoh 3. Mengkueri status pengguna saat ini

ID Microsoft Entra meminta status pengguna yang ditentukan saat ini dari layanan dengan permintaan seperti:

GET ~/scim/Users/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1 HTTP/1.1
Authorization: Bearer ...

Dalam kode sampel, permintaan diterjemahkan ke dalam panggilan ke metode RetrieveAsync penyedia layanan. Berikut adalah tanda tangan metode itu:

// System.Threading.Tasks.Tasks is defined in mscorlib.dll.  
// Microsoft.SCIM.IRequest is defined in 
// Microsoft.SCIM.Service.  
// Microsoft.SCIM.Resource and 
// Microsoft.SCIM.IResourceRetrievalParameters 
// are defined in Microsoft.SCIM.Schemas 

Task<Resource> RetrieveAsync(IRequest<IResourceRetrievalParameters> request);

Dalam contoh permintaan, untuk mengambil status pengguna saat ini, nilai properti objek yang disediakan sebagai nilai argumen parameter adalah sebagai berikut:

  • Pengidentifikasi: "a0a0a0a0-bbbb-cc-dddd-e1e1e1e1e1e1"
  • Pengidentifikasi skema: urn:ietf:params:scim:schemas:extension:enterprise:2.0:User

Contoh 4. Mengkueri nilai atribut referensi yang akan diperbarui

MICROSOFT Entra ID memeriksa nilai atribut saat ini di penyimpanan identitas sebelum memperbaruinya. Namun, hanya atribut manajer yang diperiksa terlebih dahulu untuk pengguna. Berikut adalah contoh permintaan untuk menentukan apakah atribut manajer objek pengguna saat ini memiliki nilai tertentu: Dalam kode sampel, permintaan diterjemahkan ke dalam panggilan ke metode QueryAsync penyedia layanan. Nilai properti objek yang disediakan sebagai nilai argumen parameter adalah sebagai berikut:

  • Parameter. AlternateFilters.Count: 2
  • Parameter. AlternateFilters.ElementAt(x). AttributePath: "ID"
  • Parameter. AlternateFilters.ElementAt(x). PerbandinganOperator: PerbandinganOperator.Equals
  • Parameter. AlternateFilter.ElementAt(x). ComparisonValue: "a0a0a0a0-bbbb-cc-dddd-e1e1e1e1e1e1e1"
  • Parameter. AlternateFilters.ElementAt(y). AttributePath: "manager"
  • Parameter. AlternateFilters.ElementAt(y). PerbandinganOperator: PerbandinganOperator.Equals
  • Parameter. AlternateFilter.ElementAt(y). Nilai Perbandingan: "00aa00aa-bb11-cc22-dd33-44ee44ee44ee"
  • Parameter. RequestedAttributePaths.ElementAt(0): "ID"
  • Parameter. Pengidentifikasi skema: urn:ietf:params:scim:schemas:extension:enterprise:2.0:User

Nilai indeks x bisa dan 0 nilai indeks y bisa .1 Atau nilai x bisa dan 1 nilai y bisa .0 Ini tergantung pada urutan ekspresi parameter kueri filter.

Contoh 5. Permintaan dari ID Microsoft Entra ke titik akhir SCIM untuk memperbarui pengguna

Berikut adalah contoh permintaan dari ID Microsoft Entra ke titik akhir SCIM untuk memperbarui pengguna:

PATCH ~/scim/Users/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1 HTTP/1.1
Authorization: Bearer ...
Content-type: application/scim+json
{
    "schemas": 
    [
      "urn:ietf:params:scim:api:messages:2.0:PatchOp"],
    "Operations":
    [
      {
        "op":"Add",
        "path":"manager",
        "value":
          [
            {
              "$ref":"http://.../scim/Users/00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
              "value":"00aa00aa-bb11-cc22-dd33-44ee44ee44ee"}]}]}

Dalam kode sampel, permintaan diterjemahkan ke dalam panggilan ke metode UpdateAsync penyedia layanan. Berikut adalah tanda tangan metode itu:

// System.Threading.Tasks.Tasks and 
// System.Collections.Generic.IReadOnlyCollection<T>  // are defined in mscorlib.dll.  
// Microsoft.SCIM.IRequest is defined in
// Microsoft.SCIM.Service.
// Microsoft.SCIM.IPatch, 
// is defined in Microsoft.SCIM.Protocol. 

Task UpdateAsync(IRequest<IPatch> request);

Dalam contoh permintaan, untuk memperbarui pengguna, objek yang disediakan sebagai nilai argumen patch memiliki nilai properti ini:

Argumen Nilai
ResourceIdentifier.Identifier "a0a0a0a0-bbbb-cc-dddd-e1e1e1e1e1e1e1"
ResourceIdentifier.SchemaIdentifier urn:ietf:params:scim:schemas:extension:enterprise:2.0:User
(PatchRequest as PatchRequest2).Operations.Count 1
(PatchRequest as PatchRequest2).Operations.ElementAt(0).OperationName OperationName.Add
(PatchRequest as PatchRequest2).Operations.ElementAt(0).Path.AttributePath Manajer
(PatchRequest as PatchRequest2).Operations.ElementAt(0).Value.Count 1
(PatchRequest as PatchRequest2).Operations.ElementAt(0).Value.ElementAt(0).Reference http://.../scim/Users/00aa00aa-bb11-cc22-dd33-44ee44ee44ee
(PatchRequest as PatchRequest2).Operations.ElementAt(0).Value.ElementAt(0).Value 00aa00aa-bb11-cc22-dd33-44ee44ee44ee

Contoh 6. Membatalkan provisi pengguna

Untuk mencabut akses pengguna dari penyimpanan identitas yang dihadapkan oleh titik akhir SCIM, MICROSOFT Entra ID mengirimkan permintaan seperti:

DELETE ~/scim/Users/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1 HTTP/1.1
Authorization: Bearer ...

Dalam kode sampel, permintaan diterjemahkan ke dalam panggilan ke metode DeleteAsync penyedia layanan. Berikut adalah tanda tangan metode itu:

// System.Threading.Tasks.Tasks is defined in mscorlib.dll.  
// Microsoft.SCIM.IRequest is defined in 
// Microsoft.SCIM.Service.  
// Microsoft.SCIM.IResourceIdentifier, 
// is defined in Microsoft.SCIM.Protocol. 

Task DeleteAsync(IRequest<IResourceIdentifier> request);

Objek yang disediakan sebagai nilai argumen resourceIdentifier memiliki nilai properti ini dalam contoh permintaan untuk mencabut provisi pengguna:

  • ResourceIdentifier.Identifier: "a0a0a0a0-bbbb-cc-dddd-e1e1e1e1e1e1e1"
  • ResourceIdentifier.SchemaIdentifier: urn:ietf:params:scim:schemas:extension:enterprise:2.0:User

Mengintegrasikan titik akhir SCIM Anda dengan layanan provisi Microsoft Entra

ID Microsoft Entra dapat dikonfigurasi untuk memprovisikan pengguna dan grup yang ditetapkan secara otomatis ke aplikasi yang menerapkan profil tertentu dari protokol SCIM 2.0. Spesifikasi profil didokumentasikan dalam Memahami implementasi Microsoft Entra SCIM.

Tanyakan kepada penyedia aplikasi Anda, atau dokumentasi penyedia aplikasi Anda untuk pernyataan kompatibilitas dengan persyaratan ini.

Penting

Implementasi Microsoft Entra SCIM dibangun di atas layanan provisi pengguna Microsoft Entra, yang dirancang untuk terus menjaga pengguna tetap sinkron antara ID Microsoft Entra dan aplikasi target, dan menerapkan serangkaian operasi standar yang sangat spesifik. Penting untuk memahami perilaku ini untuk memahami perilaku layanan provisi Microsoft Entra. Untuk informasi selengkapnya, lihat bagian Siklus provisi: Awal dan bertahap dalam Cara kerja provisi.

Persiapan

Ujung

Langkah-langkah dalam artikel ini mungkin sedikit berbeda berdasarkan portal tempat Anda memulai.

Aplikasi yang mendukung profil SCIM yang dijelaskan dalam artikel ini dapat dihubungkan ke ID Microsoft Entra menggunakan fitur "aplikasi non-galeri" di galeri aplikasi Microsoft Entra. Setelah tersambung, MICROSOFT Entra ID menjalankan proses sinkronisasi. Proses berjalan setiap 40 menit. Proses ini meminta titik akhir SCIM aplikasi untuk pengguna dan grup yang ditetapkan, dan membuat atau memodifikasinya sesuai dengan detail penugasan.

Untuk menyambungkan aplikasi yang mendukung SCIM:

  1. Masuk ke pusat admin Microsoft Entra sebagai setidaknya Administrator Aplikasi.

  2. Telusuri aplikasi Identity>Applications>Enterprise.

  3. Daftar semua aplikasi yang dikonfigurasi ditampilkan, termasuk aplikasi yang ditambahkan dari galeri.

  4. Pilih + Aplikasi> baru+ Buat aplikasi Anda sendiri.

  5. Masukkan nama untuk aplikasi Anda, pilih opsi "integrasikan aplikasi lain yang tidak Anda temukan di galeri" dan pilih Tambahkan untuk membuat objek aplikasi. Aplikasi baru ditambahkan ke daftar aplikasi perusahaan dan terbuka ke layar manajemen aplikasinya.

    Cuplikan layar berikut menunjukkan galeri aplikasi Microsoft Entra:

    Cuplikan layar memperlihatkan galeri aplikasi Microsoft Entra.

  6. Di layar manajemen aplikasi, pilih Provisi di panel kiri.

  7. Di menu Mode Provisi, pilih Otomatis.

    Cuplikan layar berikut menunjukkan konfigurasi pengaturan provisi di pusat admin Microsoft Entra:

    Cuplikan layar halaman provisi aplikasi di pusat admin Microsoft Entra.

  8. Di bidang URL Penyewa, masukkan URL titik akhir SCIM aplikasi. Contoh: https://api.contoso.com/scim/

  9. Jika titik akhir SCIM memerlukan token pembawa OAuth dari penerbit selain ID Microsoft Entra, salin token pembawa OAuth yang diperlukan ke bidang Token Rahasia opsional. Jika bidang ini dibiarkan kosong, ID Microsoft Entra menyertakan token pembawa OAuth yang dikeluarkan dari ID Microsoft Entra dengan setiap permintaan. Aplikasi yang menggunakan ID Microsoft Entra sebagai idP dapat memvalidasi token yang dikeluarkan ID Microsoft Entra ini.

    Nota

    Tidak disarankan untuk membiarkan bidang ini kosong dan mengandalkan token yang dihasilkan oleh ID Microsoft Entra. Opsi ini terutama tersedia untuk tujuan pengujian.

  10. Pilih Uji Koneksi agar MICROSOFT Entra ID mencoba menyambungkan ke titik akhir SCIM. Jika upaya gagal, informasi kesalahan ditampilkan.

    Nota

    Uji Koneksi meminta titik akhir SCIM untuk pengguna yang tidak ada, menggunakan GUID acak sebagai properti pencocokan yang dipilih dalam konfigurasi Microsoft Entra. Respons yang diharapkan benar adalah HTTP 200 OK dengan pesan SCIM ListResponse kosong.

  11. Jika upaya untuk menyambungkan ke aplikasi berhasil, pilih Simpan untuk menyimpan kredensial admin.

  12. Di bagian Pemetaan , ada dua set pemetaan atribut yang dapat dipilih: satu untuk objek pengguna dan satu untuk objek grup. Pilih masing-masing untuk meninjau atribut yang disinkronkan dari ID Microsoft Entra ke aplikasi Anda. Atribut yang dipilih sebagai properti Pencocokan digunakan untuk mencocokkan pengguna dan grup di aplikasi Anda untuk operasi pembaruan. Pilih Simpan untuk menerapkan perubahan apa pun.

    Nota

    Anda dapat secara opsional menonaktifkan sinkronisasi objek grup dengan menonaktifkan pemetaan "grup".

  13. Di bawah Pengaturan, bidang Cakupan menentukan pengguna dan grup mana yang disinkronkan. Pilih Sinkronkan hanya pengguna dan grup yang ditetapkan (disarankan ) untuk hanya menyinkronkan pengguna dan grup yang ditetapkan di tab Pengguna dan grup .

  14. Setelah konfigurasi Anda selesai, atur Status Provisi ke Aktif.

  15. Pilih Simpan untuk memulai layanan provisi Microsoft Entra.

  16. Jika menyinkronkan hanya pengguna dan grup yang ditetapkan (disarankan), pilih tab Pengguna dan grup . Kemudian, tetapkan pengguna atau grup yang ingin Anda sinkronkan.

Setelah siklus awal dimulai, Anda dapat memilih Log provisi di panel kiri untuk memantau kemajuan, yang menunjukkan semua tindakan yang dilakukan oleh layanan provisi di aplikasi Anda. Untuk informasi selengkapnya tentang cara membaca log provisi Microsoft Entra, lihat Melaporkan provisi akun pengguna otomatis.

Nota

Siklus awal membutuhkan waktu lebih lama untuk dilakukan daripada sinkronisasi selanjutnya, yang terjadi sekitar setiap 40 menit selama layanan berjalan.

Jika Anda membangun aplikasi yang digunakan oleh lebih dari satu penyewa, jadikan aplikasi tersebut tersedia di galeri aplikasi Microsoft Entra. Sangat mudah bagi organisasi untuk menemukan aplikasi dan mengonfigurasi provisi. Memublikasikan aplikasi Anda di galeri Microsoft Entra dan menyediakan provisi untuk orang lain itu mudah. Lihat langkah-langkahnya di sini. Microsoft bekerja sama dengan Anda untuk mengintegrasikan aplikasi Anda ke dalam galeri, menguji titik akhir Anda, dan merilis dokumentasi onboarding untuk pelanggan.

Gunakan daftar periksa untuk onboarding aplikasi Anda dengan cepat dan pelanggan memiliki pengalaman penyebaran yang lancar. Informasi dikumpulkan dari Anda saat onboarding ke galeri.

  • Mendukung titik akhir pengguna dan grup SCIM 2.0 (Hanya satu yang diperlukan tetapi keduanya direkomendasikan)
  • Mendukung setidaknya 25 permintaan per detik per penyewa untuk memastikan bahwa pengguna dan grup disediakan dan dicabut aksesnya tanpa penundaan (Diperlukan)
  • Membangun kontak rekayasa dan dukungan untuk memandu pelanggan memposting onboarding galeri (Diperlukan)
  • 3 Kredensial pengujian yang tidak kedaluwarsa untuk aplikasi Anda (Diperlukan)
  • Mendukung pemberian kode otorisasi OAuth atau token berumur panjang seperti yang dijelaskan dalam contoh (Diperlukan)
  • Aplikasi OIDC harus memiliki setidaknya 1 peran (kustom atau default) yang ditentukan
  • Membangun titik kontak rekayasa dan dukungan untuk mendukung pelanggan memposting onboarding galeri (Diperlukan)
  • Mendukung penemuan skema (diperlukan)
  • Dukungan memperbarui beberapa keanggotaan grup dengan satu PATCH
  • Dokumentasikan titik akhir SCIM Anda secara publik

Spesifikasi SCIM tidak menentukan skema khusus SCIM untuk autentikasi dan otorisasi dan bergantung pada penggunaan standar industri yang ada.

Metode otorisasi Pro Kontra Dukung
Nama pengguna dan kata sandi (tidak direkomendasikan atau didukung oleh ID Microsoft Entra) Mudah diimplementasikan Tidak aman - Pa$$word Anda tidak masalah Tidak didukung untuk galeri baru atau aplikasi non-galeri.
Token pembawa berumur panjang Token berumur panjang tidak mengharuskan pengguna untuk hadir. Admin mudah digunakan saat menyiapkan provisi. Token berumur panjang bisa sulit dibagikan dengan admin tanpa menggunakan metode yang tidak aman seperti email. Didukung untuk aplikasi galeri dan non-galeri.
Pemberian kode otorisasi OAuth Token akses memiliki masa pakai yang lebih pendek daripada kata sandi, dan memiliki mekanisme refresh otomatis yang tidak dimiliki token pembawa berumur panjang. Pengguna nyata harus ada selama otorisasi awal, menambahkan tingkat akuntabilitas. Mengharuskan pengguna untuk hadir. Jika pengguna meninggalkan organisasi, token tidak valid, dan otorisasi perlu diselesaikan lagi. Didukung untuk aplikasi galeri, tetapi bukan aplikasi non-galeri. Namun, Anda dapat memberikan token akses di UI sebagai token rahasia untuk tujuan pengujian jangka pendek. Dukungan untuk pemberian kode OAuth di non-galeri ada di backlog kami, selain dukungan untuk URL autentikasi / token yang dapat dikonfigurasi di aplikasi galeri.
Pemberian kredensial klien OAuth Token akses memiliki masa pakai yang lebih pendek daripada kata sandi, dan memiliki mekanisme refresh otomatis yang tidak dimiliki token pembawa berumur panjang. Pemberian kode otorisasi dan pemberian kredensial klien membuat jenis token akses yang sama, sehingga berpindah di antara metode ini transparan ke API. Provisi dapat diotomatisasi, dan token baru dapat diminta secara diam-diam tanpa interaksi pengguna. Didukung untuk aplikasi galeri, tetapi bukan aplikasi non-galeri. Namun, Anda dapat memberikan token akses di UI sebagai token rahasia untuk tujuan pengujian jangka pendek. Dukungan untuk pemberian kredensial klien OAuth di non-galeri ada di backlog kami.

Nota

Tidak disarankan untuk membiarkan bidang token kosong di antarmuka pengguna aplikasi kustom konfigurasi provisi Microsoft Entra. Token yang dihasilkan terutama tersedia untuk tujuan pengujian.

Alur pemberian kode OAuth

Layanan provisi mendukung pemberian kode otorisasi dan setelah mengirimkan permintaan Anda untuk menerbitkan aplikasi Anda di galeri, tim kami akan bekerja sama dengan Anda untuk mengumpulkan informasi berikut:

  • URL Otorisasi, URL oleh klien untuk mendapatkan otorisasi dari pemilik sumber daya melalui pengalihan agen pengguna. Pengguna dialihkan ke URL ini untuk mengotorisasi akses.

  • URL pertukaran token, URL oleh klien untuk menukar pemberian otorisasi dengan token akses, biasanya dengan autentikasi klien.

  • ID klien, server otorisasi mengeluarkan klien terdaftar pengidentifikasi klien, yang merupakan string unik yang mewakili informasi pendaftaran yang disediakan oleh klien. Pengidentifikasi klien bukan rahasia; ini diekspos ke pemilik sumber daya dan tidak boleh digunakan sendiri untuk autentikasi klien.

  • Rahasia klien, rahasia yang dihasilkan oleh server otorisasi yang seharusnya menjadi nilai unik yang hanya diketahui oleh server otorisasi.

Nota

URL Otorisasi dan URL pertukaran Token saat ini tidak dapat dikonfigurasi per penyewa.

Nota

OAuth v1 tidak didukung karena paparan rahasia klien. OAuth v2 didukung.

Saat menggunakan alur Pemberian Kode OAuth, Anda harus mendukung model di mana setiap pelanggan akan mengirimkan ID klien dan Rahasia Klien mereka sendiri saat menyiapkan instans provisi. Pasangan ID klien lebar aplikasi tunggal/Rahasia Klien tidak didukung.

Cara menyiapkan alur pemberian kode OAuth

  1. Masuk ke pusat admin Microsoft Entra sebagai setidaknya Administrator Aplikasi.

  2. Telusuri ke Provisi Aplikasi>Perusahaan>Aplikasi>Identitas>dan pilih Otorisasi.

  3. Masuk ke pusat admin Microsoft Entra sebagai setidaknya Administrator Aplikasi.

  4. Telusuri aplikasi Identity>Applications>Enterprise.

  5. Pilih aplikasi Anda dan buka Provisi.

  6. Pilih Otorisasi.

    1. Pengguna dialihkan ke URL Otorisasi (halaman masuk untuk aplikasi pihak ketiga).

    2. Admin memberikan kredensial ke aplikasi pihak ketiga.

    3. Aplikasi pihak ketiga mengalihkan pengguna kembali dan menyediakan kode pemberian

    4. Layanan Provisi memanggil URL token dan menyediakan kode pemberian. Aplikasi pihak ketiga merespons dengan token akses, token refresh, dan tanggal kedaluwarsa

  7. Ketika siklus provisi dimulai, layanan memeriksa apakah token akses saat ini valid dan menukarnya dengan token baru jika diperlukan. Token akses disediakan di setiap permintaan yang dibuat ke aplikasi dan validitas permintaan diperiksa sebelum setiap permintaan.

Nota

Meskipun tidak mungkin untuk mengatur OAuth pada aplikasi non-galeri, Anda dapat membuat token akses secara manual dari server otorisasi Anda dan memasukkannya sebagai token rahasia ke aplikasi non-galeri. Ini memungkinkan Anda memverifikasi kompatibilitas server SCIM Anda dengan layanan provisi Microsoft Entra sebelum onboarding ke galeri aplikasi, yang mendukung pemberian kode OAuth.

Token pembawa OAuth berumur panjang: Jika aplikasi Anda tidak mendukung alur pemberian kode otorisasi OAuth, sebagai gantinya menghasilkan token pembawa OAuth berumur panjang yang dapat digunakan administrator untuk menyiapkan integrasi provisi. Token harus abadi, atau pekerjaan provisi dikarantina ketika token kedaluwarsa.

Untuk metode autentikasi dan otorisasi lainnya, beri tahu kami di UserVoice.

Untuk membantu mendorong kesadaran dan permintaan integrasi bersama kami, kami sarankan Anda memperbarui dokumentasi yang ada dan memperkuat integrasi di saluran pemasaran Anda. Kami menyarankan Anda untuk menyelesaikan daftar periksa berikut untuk mendukung peluncuran:

  • Pastikan tim penjualan dan dukungan pelanggan Anda sadar, siap, dan dapat berbicara dengan kemampuan integrasi. Singkat tim Anda, berikan faq kepada mereka dan sertakan integrasi ke dalam materi penjualan Anda.
  • Buat posting blog atau siaran pers yang menjelaskan integrasi bersama, manfaat, dan cara memulai. Contoh: Imprivata dan Microsoft Entra Press Release
  • Manfaatkan media sosial Anda seperti X, Facebook, atau LinkedIn untuk mempromosikan integrasi ke pelanggan Anda. Pastikan untuk menyertakan @Microsoft ID Entra sehingga kami dapat me-retweet posting Anda. Contoh: Imprivata X Post
  • Buat atau perbarui halaman/situs web pemasaran Anda (seperti halaman integrasi, halaman mitra, halaman harga, dan sebagainya) untuk menyertakan ketersediaan integrasi bersama. Contoh: Halaman integrasi Pingboard, halaman integrasi Smartsheet, halaman harga Monday.com
  • Buat artikel pusat bantuan atau dokumentasi teknis tentang bagaimana pelanggan dapat memulai. Contoh: Integrasi Envoy + Microsoft Entra.
  • Beri tahu pelanggan tentang integrasi baru melalui komunikasi pelanggan Anda (buletin bulanan, kampanye email, catatan rilis produk).

Langkah berikutnya