Filtry zabezpieczeń do przycinania wyników wyszukiwania usługi Azure AI przy użyciu usługi MAzure Active Directory
W tym artykule pokazano, jak używać tożsamości zabezpieczeń wraz z filtrami w usłudze Azure AI Search w celu przycinania wyników wyszukiwania na podstawie członkostwa w grupie użytkowników.
W tym artykule opisano następujące zadania:
- Tworzenie grup i użytkowników
- Kojarzenie użytkownika z utworzoną grupą
- Buforowanie nowych grup
- Indeksowanie dokumentów ze skojarzonymi grupami
- Wystawianie żądania wyszukiwania z filtrem identyfikatorów grup
Wymagania wstępne
Indeks w usłudze Azure AI Search musi zawierać pole zabezpieczeń do przechowywania listy tożsamości grup mających dostęp do odczytu do dokumentu. W tym przypadku użycia założono, że korespondencja jeden do jednego między zabezpieczanym elementem (takim jak aplikacja kolegium osoby) i polem bezpieczeństwa określającym, kto ma dostęp do tego elementu (personel przyjęć).
Aby tworzyć użytkowników, grupy i skojarzenia, musisz mieć uprawnienia administratora dzierżawy (właściciela lub administratora).
Aplikacja musi być również zarejestrowana jako aplikacja wielodostępna zgodnie z opisem w poniższej procedurze.
Rejestrowanie aplikacji w usłudze Azure Active Directory
Ten krok integruje aplikację z usługą Azure Active Directory w celu akceptowania logowania kont użytkowników i grup. Jeśli nie jesteś administratorem dzierżawy w organizacji, może być konieczne utworzenie nowej dzierżawy, aby wykonać następujące kroki.
W witrynie Azure Portal znajdź dzierżawę usługi Azure Active Directory.
Po lewej stronie w obszarze Zarządzaj wybierz pozycję Rejestracje aplikacji, a następnie wybierz pozycję Nowa rejestracja.
Nadaj rejestracji nazwę, być może nazwę podobną do nazwy aplikacji wyszukiwania. Zapoznaj się z tym artykułem, aby uzyskać informacje o innych właściwościach opcjonalnych.
Wybierz pozycję Zarejestruj.
Po utworzeniu rejestracji aplikacji skopiuj identyfikator aplikacji (klienta). Musisz podać ten ciąg aplikacji.
Jeśli przechodzisz przez proces przechodzenia przez element DotNetHowToSecurityTrimming, wklej tę wartość do pliku app.config .
Skopiuj identyfikator katalogu (dzierżawy).
Po lewej stronie wybierz pozycję Uprawnienia interfejsu API, a następnie wybierz pozycję Dodaj uprawnienie.
Wybierz pozycję Microsoft Graph , a następnie wybierz pozycję Delegowane uprawnienia.
Wyszukaj i dodaj następujące delegowane uprawnienia:
- Directory.ReadWrite.All
- Group.ReadWrite.All
- User.ReadWrite.All
Program Microsoft Graph udostępnia interfejs API, który umożliwia programowy dostęp do usługi Azure Active Directory za pośrednictwem interfejsu API REST. Przykładowy kod w tym przewodniku używa uprawnień do wywoływania interfejsu API programu Microsoft Graph do tworzenia grup, użytkowników i skojarzeń. Interfejsy API są również używane do buforowania identyfikatorów grup w celu szybszego filtrowania.
Wybierz pozycję Udziel zgody administratora dla dzierżawy , aby ukończyć proces wyrażania zgody.
Tworzenie użytkowników i grup
Jeśli dodasz wyszukiwanie do ustanowionej aplikacji, możesz mieć istniejące identyfikatory użytkowników i grup w usłudze Azure Active Directory. W takim przypadku możesz pominąć kolejne trzy kroki.
Jeśli jednak nie masz istniejących użytkowników, możesz użyć interfejsów API programu Microsoft Graph do utworzenia podmiotów zabezpieczeń. Poniższe fragmenty kodu pokazują, jak wygenerować identyfikatory, które stają się wartościami danych dla pola zabezpieczeń w indeksie usługi Azure AI Search. W naszej hipotetycznej aplikacji przyjęć uczelni byłoby to identyfikatory bezpieczeństwa dla pracowników przyjęć.
Członkostwo użytkowników i grup może być bardzo płynne, zwłaszcza w dużych organizacjach. Kod, który tworzy tożsamości użytkowników i grup, powinien być uruchamiany wystarczająco często, aby pobierać zmiany w członkostwie w organizacji. Podobnie indeks usługi Azure AI Search wymaga podobnego harmonogramu aktualizacji, aby odzwierciedlał bieżący stan dozwolonych użytkowników i zasobów.
Krok 1. Tworzenie grupy
private static Dictionary<Group, List<User>> CreateGroupsWithUsers(string tenant)
{
Group group = new Group()
{
DisplayName = "My First Prog Group",
SecurityEnabled = true,
MailEnabled = false,
MailNickname = "group1"
};
Krok 2. Tworzenie użytkownika
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
};
Krok 3. Kojarzenie użytkownika i grupy
List<User> users = new List<User>() { user1, user2 };
Dictionary<Group, List<User>> groups = new Dictionary<Group, List<User>>() { { group, users } };
Krok 4. Buforowanie identyfikatorów grup
Opcjonalnie, aby zmniejszyć opóźnienie sieci, można buforować skojarzenia grupy użytkowników, aby po wysłaniu żądania wyszukiwania grupy użytkowników grupy zostały zwrócone z pamięci podręcznej grupy, zapisując rundy. Interfejs API usługi Batch umożliwia wysyłanie pojedynczego żądania HTTP z wieloma użytkownikami i tworzenie pamięci podręcznej.
Usługa Microsoft Graph została zaprojektowana z myślą o obsłudze dużej liczby żądań. Jeśli wystąpi przytłaczająca liczba żądań, program Microsoft Graph zakończy się niepowodzeniem żądania z kodem stanu HTTP 429. Aby uzyskać więcej informacji, zobacz Ograniczanie przepustowości programu Microsoft Graph.
Indeksowanie dokumentu z dozwolonymi grupami
Operacje zapytań w usłudze Azure AI Search są wykonywane za pośrednictwem indeksu usługi Azure AI Search. W tym kroku operacja indeksowania importuje przeszukiwalne dane do indeksu, w tym identyfikatory używane jako filtry zabezpieczeń.
Usługa Azure AI Search nie uwierzytelnia tożsamości użytkowników ani nie udostępnia logiki określania zawartości, którą użytkownik ma uprawnienia do wyświetlania. W przypadku przycinania zabezpieczeń przyjęto założenie, że należy podać skojarzenie między poufnym dokumentem a identyfikatorem grupy mającym dostęp do tego dokumentu, zaimportowanym bez zmian do indeksu wyszukiwania.
W hipotetycznym przykładzie treść żądania PUT w indeksie usługi Azure AI Search będzie zawierać esej lub transkrypcję wnioskodawcy wraz z identyfikatorem grupy z uprawnieniami do wyświetlania tej zawartości.
W przykładzie ogólnym używanym w przykładzie kodu dla tego przewodnika akcja indeksu może wyglądać następująco:
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);
Wystawianie żądania wyszukiwania
W celach przycinania zabezpieczeń wartości w polu zabezpieczeń w indeksie są wartościami statycznym używanymi do dołączania lub wykluczania dokumentów w wynikach wyszukiwania. Jeśli na przykład identyfikator grupy dla przyjęć to "A11B22C33D44-E55F66G77-H88I99JKK", wszystkie dokumenty w indeksie usługi Azure AI Search o tym identyfikatorze w polu zabezpieczeń są uwzględniane (lub wykluczone) w wynikach wyszukiwania wysyłanych z powrotem do obiektu wywołującego.
Aby filtrować dokumenty zwracane w wynikach wyszukiwania na podstawie grup użytkowników wysyłających żądanie, zapoznaj się z poniższymi krokami.
Krok 1. Pobieranie identyfikatorów grupy użytkownika
Jeśli grupy użytkownika nie zostały jeszcze zbuforowane lub pamięć podręczna wygasła, wydaj żądanie 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);
}
Krok 2. Tworzenie żądania wyszukiwania
Zakładając, że masz członkostwo w grupach użytkownika, możesz wysłać żądanie wyszukiwania z odpowiednimi wartościami filtru.
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));
}
Krok 3. Obsługa wyników
Odpowiedź zawiera filtrowaną listę dokumentów składających się z tych, które użytkownik ma uprawnienia do wyświetlania. W zależności od sposobu konstruowania strony wyników wyszukiwania może być konieczne uwzględnienie wskazówek wizualnych, aby odzwierciedlić filtrowany zestaw wyników.
Wnioski
W tym przewodniku przedstawiono wzorzec używania logów użytkowników do filtrowania dokumentów w wynikach usługi Azure AI Search, przycinając wyniki dokumentów, które nie są zgodne z filtrem podanym w żądaniu.