Microsoft Entra kiracılarını ve kimliklerini kullanarak Azure AI Arama sonuçlarını kırpmaya yönelik güvenlik filtreleri

Bu makalede, arama sonuçlarını kullanıcı grubu üyeliğine göre kırpmak için Microsoft Entra güvenlik kimliklerinin Azure AI Search'teki filtrelerle birlikte nasıl kullanılacağı gösterilmektedir.

Bu makale aşağıdaki görevleri kapsar:

  • Microsoft Entra grupları ve kullanıcıları oluşturma
  • Kullanıcıyı oluşturduğunuz grupla ilişkilendirme
  • Yeni grupları önbelleğe alma
  • İlişkili gruplarla belgeleri dizine ekleme
  • Grup tanımlayıcıları filtresiyle arama isteği verme

Önkoşullar

Azure AI Search'teki dizininizin, belgeye okuma erişimi olan grup kimliklerinin listesini depolamak için bir güvenlik alanı olmalıdır. Bu kullanım örneğinde, güvenliği sağlanabilir bir öğe (örneğin, bir kişinin üniversite uygulaması) ile söz konusu öğeye erişimi olan kişileri belirten bir güvenlik alanı (kabul personeli) arasında bire bir yazışma olduğu varsayılır.

Kullanıcı, grup ve ilişkilendirme oluşturmak için Microsoft Entra yönetici izinlerine (Sahip veya yönetici) sahip olmanız gerekir.

Uygulamanızın, aşağıdaki yordamda açıklandığı gibi çok kiracılı bir uygulama olarak Microsoft Entra Id ile de kaydedilmesi gerekir.

Uygulamanızı Microsoft Entra Id ile kaydetme

Bu adım, kullanıcı ve grup hesaplarının oturum açmalarını kabul etmek amacıyla uygulamanızı Microsoft Entra Id ile tümleştirir. Kuruluşunuzda kiracı yöneticisi değilseniz, aşağıdaki adımları gerçekleştirmek için yeni bir kiracı oluşturmanız gerekebilir.

  1. Azure portalında Microsoft Entra Id kiracısını bulun.

  2. Sol taraftaki Yönet'in altında Uygulama kayıtları'ı ve ardından Yeni kayıt'ı seçin.

  3. Kayda bir ad verin, belki de arama uygulaması adına benzer bir ad verin. Diğer isteğe bağlı özellikler hakkında bilgi için bu makaleye bakın.

  4. Kaydet'i seçin.

  5. Uygulama kaydı oluşturulduktan sonra Uygulama (istemci) kimliğini kopyalayın. Bu dizeyi uygulamanıza sağlamanız gerekir.

    DotNetHowToSecurityTrimming'de adım adım ilerlerseniz, bu değeri app.config dosyasına yapıştırın.

  6. Dizin (kiracı) kimliğini kopyalayın.

    Screenshot of the application ID in the Essentials section.

  7. Sol tarafta API izinleri'ni ve ardından İzin ekle'yi seçin.

  8. Microsoft Graph'ı ve ardından Temsilcili izinler'i seçin.

  9. Aşağıdaki temsilci izinlerini arayın ve ekleyin:

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

    Microsoft Graph, REST API aracılığıyla Microsoft Entra Id'ye program aracılığıyla erişim sağlayan bir API sağlar. Bu izlenecek yol için kod örneği; grupları, kullanıcıları ve ilişkilendirmeleri oluşturmak için Microsoft Graph API'sini çağırma izinlerini kullanır. API'ler daha hızlı filtreleme için grup tanımlayıcılarını önbelleğe almak için de kullanılır.

  10. Onay işlemini tamamlamak için Kiracı için yönetici onayı ver'i seçin.

Kullanıcı ve grup oluşturma

Yerleşik bir uygulamaya arama ekliyorsanız, Microsoft Entra Id'de mevcut kullanıcı ve grup tanımlayıcılarınız olabilir. Bu durumda, sonraki üç adımı atlayabilirsiniz.

Ancak, mevcut kullanıcılarınız yoksa, güvenlik sorumlularını oluşturmak için Microsoft Graph API'lerini kullanabilirsiniz. Aşağıdaki kod parçacıkları, Azure AI Search dizininizdeki güvenlik alanı için veri değerlerine dönüşen tanımlayıcıların nasıl oluşturulacağı gösterilmektedir. Varsayımsal üniversite kabul başvurumuzda bu, kabul personelinin güvenlik tanımlayıcıları olacaktır.

Özellikle büyük kuruluşlarda kullanıcı ve grup üyeliği çok akıcı olabilir. Kullanıcı ve grup kimliklerini oluşturan kod, kuruluş üyeliğindeki değişiklikleri almak için yeterince sık çalıştırılmalıdır. Benzer şekilde, Azure AI Search dizininiz izin verilen kullanıcıların ve kaynakların geçerli durumunu yansıtmak için benzer bir güncelleştirme zamanlaması gerektirir.

1. Adım: Grup Oluştur

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

2. Adım: Kullanıcı Oluşturma

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
};

3. Adım: Kullanıcı ve grubu ilişkilendirme

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

4. Adım: Grup tanımlayıcılarını önbelleğe alma

İsteğe bağlı olarak, ağ gecikme süresini azaltmak için kullanıcı grubu ilişkilendirmelerini önbelleğe alabilirsiniz; böylece bir arama isteği yayımlandığında önbellekten gruplar döndürülür ve Microsoft Entra Id'ye gidiş dönüş kaydedilir. Birden çok kullanıcıyla tek bir Http isteği göndermek ve önbelleği oluşturmak için Microsoft Entra Batch API'sini kullanabilirsiniz.

Microsoft Graph, büyük istek hacimlerini işleyebilecek şekilde tasarlanmıştır. Aşırı sayıda istek oluşursa, Microsoft Graph isteği HTTP durum kodu 429 ile başarısız olur. Daha fazla bilgi için bkz . Microsoft Graph azaltma.

Belgeyi izin verilen gruplarla dizine ekleme

Azure AI Search'teki sorgu işlemleri bir Azure AI Search dizini üzerinden yürütülür. Bu adımda, dizin oluşturma işlemi, güvenlik filtreleri olarak kullanılan tanımlayıcılar da dahil olmak üzere aranabilir verileri bir dizine aktarır.

Azure AI Search, kullanıcı kimliklerinin kimliğini doğrulamaz veya kullanıcının görüntüleme iznine sahip olduğu içeriği belirleme mantığı sağlar. Güvenlik kırpması için kullanım örneği, hassas bir belge ile söz konusu belgeye erişimi olan grup tanımlayıcısı arasındaki ilişkiyi sağladığınızı ve arama dizinine olduğu gibi içeri aktarıldığını varsayar.

Varsayımsal örnekte, Azure AI Search dizinindeki PUT isteğinin gövdesinde bir başvuru sahibinin üniversite makalesi veya transkripti ile bu içeriği görüntüleme izni olan grup tanımlayıcısı yer alır.

Bu izlenecek yol için kod örneğinde kullanılan genel örnekte, dizin eylemi aşağıdaki gibi görünebilir:

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);

Arama isteği verme

Güvenlik kırpma amacıyla, dizindeki güvenlik alanınızdaki değerler, arama sonuçlarına belge ekleme veya dışlama için kullanılan statik değerlerdir. Örneğin, Kabuller için grup tanımlayıcısı "A11B22C33D44-E55F66G77-H88I99JKK" ise, Azure AI Search dizininde güvenlik alanında bu tanımlayıcıya sahip tüm belgeler, arayana geri gönderilen arama sonuçlarına eklenir (veya hariç tutulur).

Arama sonuçlarında döndürülen belgeleri isteği veren kullanıcı gruplarına göre filtrelemek için aşağıdaki adımları gözden geçirin.

1. Adım: Kullanıcının grup tanımlayıcılarını alma

Kullanıcının grupları henüz önbelleğe alınmadıysa veya önbelleğin süresi dolduysa, grup isteğini verin.

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);
}

2. Adım: Arama isteğini oluşturma

Kullanıcının grup üyeliğine sahip olduğunuzu varsayarsak, arama isteğini uygun filtre değerleriyle yayımlayabilirsiniz.

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));
}

3. Adım: Sonuçları işleme

Yanıt, kullanıcının görüntüleme izni olan belgelerden oluşan filtrelenmiş bir belge listesi içerir. Arama sonuçları sayfasını nasıl oluşturduğunuza bağlı olarak, filtrelenmiş sonuç kümesini yansıtacak görsel ipuçları eklemek isteyebilirsiniz.

Sonraki adımlar

Bu kılavuzda, Azure AI Arama sonuçlarındaki belgeleri filtrelemek için Microsoft Entra oturum açmalarını kullanarak istekte sağlanan filtreyle eşleşmeyen belgelerin sonuçlarını kırpan bir desen öğrendiniz. Daha basit olabilecek alternatif bir düzen için veya diğer güvenlik özelliklerini yeniden ziyaret etmek için aşağıdaki bağlantılara bakın.