Filter keamanan untuk memangkas hasil Azure AI Search menggunakan Azure Active Directory

Artikel ini menunjukkan cara menggunakan identitas keamanan bersama dengan filter di Azure AI Search untuk memangkas hasil pencarian berdasarkan keanggotaan grup pengguna.

Artikel ini membahas tugas-tugas berikut:

  • Membuat grup dan pengguna
  • Mengaitkan pengguna dengan grup yang telah Anda buat
  • Simpan sementara grup-grup baru
  • Mengindeks dokumen yang memiliki grup terkait
  • Menerbitkan permintaan pencarian dengan filter pengidentifikasi grup

Prasyarat

Indeks Anda di Azure AI Search harus memiliki bidang keamanan untuk menyimpan daftar identitas grup yang memiliki akses baca ke dokumen. Kasus penggunaan ini mengasumsikan korespondensi satu-ke-satu antara item yang dapat diamankan (seperti aplikasi perguruan tinggi individu) dan bidang keamanan yang menentukan siapa yang memiliki akses ke item tersebut (personel penerimaan).

Anda harus memiliki izin administrator penyewa (Pemilik atau administrator) untuk membuat pengguna, grup, dan asosiasi.

Aplikasi Anda juga harus terdaftar sebagai aplikasi multipenyewa, seperti yang dijelaskan dalam prosedur berikut.

Mendaftarkan aplikasi Anda dengan Azure Active Directory

Langkah ini mengintegrasikan aplikasi Anda dengan Azure Active Directory untuk menerima masuk akun pengguna dan grup. Jika Anda bukan admin penyewa di organisasi, Anda mungkin perlu membuat penyewa baru untuk melakukan langkah-langkah berikut.

  1. Di portal Azure, temukan tenant Azure Active Directory.

  2. Di sebelah kiri, di bawah Kelola, pilih Pendaftaran aplikasi, lalu pilih Pendaftaran baru.

  3. Beri nama pendaftaran, mungkin nama yang mirip dengan nama aplikasi pencarian. Lihat artikel ini untuk informasi tentang properti opsional lainnya.

  4. Pilih Daftarkan.

  5. Setelah pendaftaran aplikasi dibuat, salin ID Aplikasi (klien). Anda harus memberikan string ini ke aplikasi Anda.

    Jika Anda menelusuri DotNetHowToSecurityTrimming, tempelkan nilai ini ke file app.config.

  6. Salin ID Direktori (tenant).

  7. Di sebelah kiri, pilih izin API lalu pilih Tambahkan izin.

  8. Pilih Microsoft Graph lalu pilih Izin Delegasi .

  9. Cari lalu tambahkan izin yang didelegasikan berikut ini:

    • Directory.ReadWrite.All
    • Group.ReadWrite.All
    • User.ReadWrite.All

    Microsoft Graph menyediakan API yang memungkinkan akses terprogram ke Azure Active Directory melalui REST API. Sampel kode untuk panduan ini menggunakan izin untuk memanggil Microsoft Graph API untuk membuat grup, pengguna, dan asosiasi. API juga digunakan untuk menyimpan pengidentifikasi grup untuk pemfilteran yang lebih cepat.

  10. Pilih Berikan persetujuan admin untuk penyewa untuk menyelesaikan proses persetujuan.

Membuat pengguna dan grup

Jika Anda menambahkan pencarian ke aplikasi yang dibuat, Anda mungkin memiliki pengidentifikasi pengguna dan grup yang sudah ada di Azure Active Directory. Dalam hal ini, Anda dapat melewati tiga langkah berikutnya.

Namun, jika Anda tidak memiliki pengguna yang sudah ada, Anda dapat menggunakan API Microsoft Graph untuk membuat prinsip keamanan. Cuplikan kode berikut menunjukkan cara menghasilkan pengidentifikasi, yang menjadi nilai data untuk bidang keamanan di indeks Azure AI Search Anda. Dalam aplikasi penerimaan perguruan tinggi hipotetis kami, ini akan menjadi pengidentifikasi keamanan untuk staf penerimaan.

Keanggotaan dalam pengguna dan grup mungkin sangat berubah-ubah, terutama di organisasi besar. Kode yang membangun identitas pengguna dan grup harus cukup sering berjalan untuk mengambil perubahan dalam keanggotaan organisasi. Demikian juga, indeks Azure AI Search Anda memerlukan jadwal pembaruan serupa untuk mencerminkan status pengguna dan sumber daya yang diizinkan saat ini.

Langkah 1: Membuat Grup

private static Dictionary<Group, List<User>> CreateGroupsWithUsers(string tenant)
{
    Group group = new Group()
    {
        DisplayName = "My First Prog Group",
        SecurityEnabled = true,
        MailEnabled = false,
        MailNickname = "group1"
    };

Langkah 2: Buat Pengguna

User user1 = new User()
{
    GivenName = "First User",
    Surname = "User1",
    MailNickname = "User1",
    DisplayName = "First User",
    UserPrincipalName = String.Format("user1@{0}", tenant),
    PasswordProfile = new PasswordProfile() { Password = "********" },
    AccountEnabled = true
};

Langkah 3: Mengaitkan pengguna dan grup

List<User> users = new List<User>() { user1, user2 };
Dictionary<Group, List<User>> groups = new Dictionary<Group, List<User>>() { { group, users } };

Langkah 4: Simpan pengidentifikasi grup dalam cache

Secara opsional, untuk mengurangi latensi jaringan, Anda dapat menyimpan cache asosiasi antara pengguna dan grup sehingga ketika permintaan pencarian diajukan, grup dikembalikan dari cache, menghemat satu kali transfer data. Anda dapat menggunakan Batch API untuk mengirim satu permintaan Http dengan beberapa pengguna dan membangun cache.

Microsoft Graph dirancang untuk menangani permintaan dalam volume tinggi. Jika jumlah permintaan yang luar biasa terjadi, Microsoft Graph menolak permintaan tersebut dengan kode status HTTP 429. Untuk informasi selengkapnya, lihat pembatasan Microsoft Graph .

Mengindeks dokumen dengan grup-grup yang diperbolehkan

Operasi kueri di Azure AI Search dijalankan melalui indeks Pencarian Azure AI. Dalam langkah ini, operasi pengindeksan mengimpor data yang dapat dicari ke dalam indeks, termasuk pengidentifikasi yang digunakan sebagai filter keamanan.

Azure AI Search tidak mengautentikasi identitas pengguna, atau menyediakan logika untuk membuat konten mana yang izin untuk dilihat pengguna. Kasus penggunaan untuk pembatasan akses berbasis keamanan mengasumsikan bahwa Anda menyediakan keterkaitan antara dokumen sensitif dan pengidentifikasi grup yang memiliki akses ke dokumen tersebut, yang diimpor tanpa perubahan ke dalam indeks pencarian.

Dalam contoh hipotetis, isi permintaan PUT pada indeks Pencarian Azure AI akan menyertakan esai atau transkrip perguruan tinggi pemohon bersama dengan pengidentifikasi grup yang memiliki izin untuk melihat konten tersebut.

Dalam contoh umum yang digunakan dalam sampel kode untuk panduan ini, tindakan indeks mungkin terlihat sebagai berikut:

private static void IndexDocuments(string indexName, List<string> groups)
{
    IndexDocumentsBatch<SecuredFiles> batch = IndexDocumentsBatch.Create(
        IndexDocumentsAction.Upload(
            new SecuredFiles()
            {
                FileId = "1",
                Name = "secured_file_a",
                GroupIds = new[] { groups[0] }
            }),
              ...
            };

IndexDocumentsResult result = searchClient.IndexDocuments(batch);

Mengeluarkan permintaan pencarian

Untuk tujuan pemangkasan keamanan, nilai di bidang keamanan Anda dalam indeks adalah nilai statis yang digunakan untuk menyertakan atau mengecualikan dokumen dalam hasil pencarian. Misalnya, jika pengidentifikasi grup untuk Penerimaan adalah "A11B22C33D44-E55F66G77-H88I99JKK", dokumen apa pun dalam indeks Pencarian Azure AI yang memiliki pengidentifikasi tersebut di bidang keamanan disertakan (atau dikecualikan) dalam hasil pencarian yang dikirim kembali ke pemanggil.

Untuk memfilter dokumen yang dikembalikan dalam hasil pencarian berdasarkan grup pengguna yang mengeluarkan permintaan, tinjau langkah-langkah berikut.

Langkah 1: Mengambil pengenal grup pengguna

Jika grup pengguna belum di-cache, atau cache telah kedaluwarsa, terbitkan permintaan grup .

private static async void RefreshCache(IEnumerable<User> users)
{
    HttpClient client = new HttpClient();
    var userGroups = await _microsoftGraphHelper.GetGroupsForUsers(client, users);
    _groupsCache = new ConcurrentDictionary<string, List<string>>(userGroups);
}

Langkah 2: Buat permintaan pencarian

Dengan asumsi Anda memiliki keanggotaan grup pengguna, Anda dapat mengeluarkan permintaan pencarian dengan nilai filter yang sesuai.

private static void SearchQueryWithFilter(string user)
{
    // Using the filter below, the search result will contain all documents that their GroupIds field   
    // contain any one of the Ids in the groups list
    string filter = String.Format("groupIds/any(p:search.in(p, '{0}'))", string.Join(",", String.Join(",", _groupsCache[user])));
    SearchOptions searchOptions =
        new SearchOptions()
        {
            Filter = filter
        };
    searchOptions.Select.Add("name");

    SearchResults<SecuredFiles> results = searchClient.Search<SecuredFiles>("*", searchOptions);

    Console.WriteLine("Results for groups '{0}' : {1}", _groupsCache[user], results.GetResults().Select(r => r.Document.Name));
}

Langkah 3: Tangani hasilnya

Respons mencakup daftar dokumen yang difilter, yang terdiri dari dokumen yang diizinkan untuk dilihat pengguna. Bergantung pada cara Anda membuat halaman hasil pencarian, Anda mungkin ingin menyertakan isjin visual untuk mencerminkan kumpulan hasil yang difilter.

Kesimpulan

Dalam panduan ini, Anda mempelajari pola untuk menggunakan rincian masuk pengguna untuk memfilter dokumen di hasil Pencarian Azure AI, memangkas hasil dokumen yang tidak cocok dengan filter yang disediakan pada permintaan.