Bagikan melalui


Filter keamanan untuk memangkas hasil Azure AI Search menggunakan MAzure 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 ini:

  • Membuat grup dan pengguna
  • Mengaitkan pengguna dengan grup yang telah Anda buat
  • Meng-cache grup baru
  • Mengindeks dokumen dengan grup terkait
  • Mengajukan 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 milik 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 di Azure Active Directory

Langkah ini mengintegrasikan aplikasi Anda dengan Azure Active Directory untuk tujuan menerima rincian 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 penyewa Azure Active Directory.

  2. Di sebelah kiri, di bagian 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 dalam file app.config .

  6. Salin ID Direktori (penyewa).

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

  8. Pilih Microsoft Graph, lalu pilih Izin yang didelegasikan.

  9. Cari lalu tambahkan izin yang didelegasikan berikut ini:

    • Direktori.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 guna membuat grup, pengguna, dan asosiasi. API juga digunakan untuk meng-cache pengidentifikasi grup untuk pemfilteran yang lebih cepat.

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

Mengelola 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 Microsoft Graph API 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 pengguna dan grup mungkin berjalan sangat lancar, terutama di organisasi besar. Kode yang membangun identitas pengguna dan grup harus berjalan cukup sering untuk menerapkan 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: Buat 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: Kaitkan 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 ke dalam cache

Secara opsional, untuk mengurangi latensi jaringan, Anda dapat menyimpan cache asosiasi grup pengguna sehingga ketika permintaan pencarian dikeluarkan, grup dikembalikan dari cache, menyimpan roundtrip. Anda dapat menggunakan API Batch untuk mengirim satu permintaan Http dengan beberapa pengguna dan membangun cache.

Microsoft Graph dirancang untuk menangani permintaan dalam jumlah besar. Jika jumlah permintaan yang luar biasa terjadi, Microsoft Graph menggagalkan permintaan dengan kode status HTTP 429. Untuk informasi selengkapnya, lihat Pembatasan Microsoft Graph.

Mengindeks dokumen dengan grup yang diizinkan

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 pemangkasan keamanan mengasumsikan bahwa Anda menyediakan asosiasi antara dokumen sensitif dan pengidentifikasi grup yang memiliki akses ke dokumen tersebut, yang diimpor secara utuh 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 generik 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);

Mengajukan permintaan pencarian

Untuk tujuan pemangkasan keamanan, nilai di bidang keamanan Anda dalam indeks merupakan 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 ditampilkan dalam hasil pencarian berdasarkan grup pengguna yang mengajukan permintaan, tinjau langkah-langkah berikut.

Langkah 1: Ambil pengidentifikasi 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

Jika Anda memiliki keanggotaan grup pengguna, Anda dapat mengajukan 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 menyertakan daftar dokumen yang difilter, yang terdiri dari dokumen yang memiliki izin untuk ditampilkan kepada pengguna. Bergantung pada cara Anda membuat halaman hasil pencarian, sebaiknya sertakan isyarat visual untuk mencerminkan kumpulan hasil yang difilter.

Poin-poin penting

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.