Freigeben über


Sicherheitsfilter zum Kürzen von Azure AI-Suchergebnissen mithilfe von Azure Active Directory

In diesem Artikel wird veranschaulicht, wie Sie Sicherheitsidentitäten zusammen mit Filtern in Azure AI Search verwenden, um Suchergebnisse basierend auf der Benutzergruppenmitgliedschaft zu kürzen.

In diesem Artikel werden die folgenden Aufgaben behandelt:

  • Erstellen von Gruppen und Benutzern
  • Zuordnen des Benutzers zu der gruppe, die Sie erstellt haben
  • Zwischenspeichern der neuen Gruppen
  • Dokumente mit zugeordneten Gruppen indizieren
  • Ausgeben einer Suchanforderung mit dem Gruppenbezeichnerfilter

Voraussetzungen

Ihr Index in Azure AI Search muss über ein Sicherheitsfeld verfügen, um die Liste der Gruppenidentitäten zu speichern, die Lesezugriff auf das Dokument haben. Bei diesem Anwendungsfall wird davon ausgegangen, dass eine 1:1-Korrespondenz zwischen einem sicherungsfähigen Element (z. B. dem Studienantrag einer Person) und einem Sicherheitsfeld angegeben wird, das angibt, wer Zugriff auf dieses Element hat (Zulassungspersonal).

Sie müssen über Mandantenadministrator-Berechtigungen (Besitzer oder Administrator) verfügen, um Benutzer, Gruppen und Zuordnungen zu erstellen.

Ihre Anwendung muss auch als mehrinstanzenfähige App registriert werden, wie im folgenden Verfahren beschrieben.

Registrieren Ihrer Anwendung bei Azure Active Directory

In diesem Schritt wird Ihre Anwendung in Azure Active Directory integriert, um Anmeldungen von Benutzer- und Gruppenkonten zu akzeptieren. Wenn Sie kein Mandantenadministrator in Ihrer Organisation sind, müssen Sie möglicherweise einen neuen Mandanten erstellen, um die folgenden Schritte auszuführen.

  1. Suchen Sie im Azure-Portalden Azure Active Directory-Mandanten.

  2. Wählen Sie auf der linken Seite unter VerwaltenApp-Registrierungenaus, und wählen Sie dann Neue Registrierungaus.

  3. Geben Sie der Registrierung einen Namen, vielleicht einen Namen, der dem Namen der Suchanwendung ähnelt. Informationen zu anderen optionalen Eigenschaften finden Sie in diesem Artikel.

  4. Wählen Sie Registeraus.

  5. Nachdem die App-Registrierung erstellt wurde, kopieren Sie die Anwendungs-ID (Client-ID). Sie müssen diese Zeichenfolge für Ihre Anwendung angeben.

    Wenn Sie das DotNetHowToSecurityTrimming durchlaufen, fügen Sie diesen Wert in die app.config Datei ein.

  6. Kopieren Sie die Verzeichnis (Mandanten)-ID.

  7. Wählen Sie auf der linken Seite API-Berechtigungen und dann Berechtigung hinzufügenaus.

  8. Wählen Sie Microsoft Graph und dann Delegierte Berechtigungenaus.

  9. Suchen Sie nach und fügen Sie dann die folgenden delegierten Berechtigungen hinzu:

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

    Microsoft Graph stellt eine API bereit, die den programmgesteuerten Zugriff auf Azure Active Directory über eine REST-API ermöglicht. Im Codebeispiel für diese exemplarische Vorgehensweise werden die Berechtigungen zum Aufrufen der Microsoft Graph-API zum Erstellen von Gruppen, Benutzern und Zuordnungen verwendet. Die APIs werden auch verwendet, um Gruppenbezeichner für eine schnellere Filterung zwischenzuspeichern.

  10. Wählen Sie , um die Administratorzustimmung für Mandant zu erteilen und den Zustimmungsprozess abzuschließen.

Erstellen von Benutzern und Gruppen

Wenn Sie eine suche zu einer etablierten Anwendung hinzufügen, verfügen Sie möglicherweise über vorhandene Benutzer- und Gruppen-IDs in Azure Active Directory. In diesem Fall können Sie die nächsten drei Schritte überspringen.

Wenn Sie jedoch nicht über vorhandene Benutzer verfügen, können Sie Microsoft Graph-APIs verwenden, um die Sicherheitsprinzipale zu erstellen. Die folgenden Codeausschnitte veranschaulichen, wie Bezeichner generiert werden, die zu Datenwerten für das Sicherheitsfeld in Ihrem Azure AI Search-Index werden. In unserem hypothetischen Zulassungsantrag wären dies die Sicherheitskennungen für das Zulassungspersonal.

Die Benutzer- und Gruppenmitgliedschaft kann sehr flüssig sein, insbesondere in großen Organisationen. Code, der Benutzer- und Gruppenidentitäten erstellt, sollte häufig genug ausgeführt werden, um Änderungen in der Organisationsmitgliedschaft aufzuholen. Ebenso erfordert Ihr Azure AI Search-Index einen ähnlichen Aktualisierungszeitplan, um den aktuellen Status der zulässigen Benutzer und Ressourcen widerzuspiegeln.

Schritt 1: Gruppe erstellen

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

Schritt 2: Benutzer erstellen

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

Schritt 3: Zuordnen von Benutzern und Gruppen

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

Schritt 4: Zwischenspeichern der Gruppenbezeichner

Um die Netzwerklatenz zu reduzieren, können Sie die Benutzergruppenzuordnungen zwischenspeichern, sodass Gruppen, wenn eine Suchanforderung ausgegeben wird, aus dem Cache zurückgegeben werden und ein Netzwerkzugriff eingespart wird. Sie können Batch-API- verwenden, um eine einzelne HTTP-Anforderung mit mehreren Benutzern zu senden und den Cache zu erstellen.

Microsoft Graph wurde entwickelt, um eine hohe Anzahl von Anforderungen zu verarbeiten. Wenn eine überwältigende Anzahl von Anforderungen auftritt, schlägt Microsoft Graph die Anforderung mit dem HTTP-Statuscode 429 fehl. Weitere Informationen finden Sie unter Microsoft Graph-Drosselung.

Indexdokument mit seinen zulässigen Gruppen

Abfragevorgänge in Azure AI Search werden über einen Azure AI Search-Index ausgeführt. In diesem Schritt importiert ein Indizierungsvorgang durchsuchbare Daten in einen Index, einschließlich der Bezeichner, die als Sicherheitsfilter verwendet werden.

Azure AI Search authentifiziert keine Benutzeridentitäten und stellt keine Logik bereit, um festzulegen, auf welche Inhalte ein Benutzer zugreifen darf. Bei der Sicherheitstrimmung wird angenommen, dass Sie die Zuordnung zwischen einem vertraulichen Dokument und dem Gruppenbezeichner, der Zugriff auf dieses Dokument hat, intakt in einen Suchindex importieren.

Im hypothetischen Beispiel würde der Hauptteil der PUT-Anforderung in einem Azure AI Search-Index das College-Essay oder Transkript eines Antragstellers zusammen mit dem Gruppenbezeichner enthalten, der die Berechtigung zum Zugriff auf diesen Inhalt hat.

Im generischen Beispiel, das im Codebeispiel für diese exemplarische Vorgehensweise verwendet wird, kann die Indexaktion wie folgt aussehen:

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

Eine Suchanfrage erteilen

Für Sicherheitskürzungszwecke sind die Werte in Ihrem Sicherheitsfeld im Index statische Werte, die zum Einschließen oder Ausschließen von Dokumenten in Suchergebnissen verwendet werden. Wenn der Gruppenbezeichner für "Admissions" beispielsweise "A11B22C33D44-E55F66G77-H88I99JKK" lautet, werden alle Dokumente in einem Azure AI Search-Index mit diesem Bezeichner im Sicherheitsfeld in die suchergebnisse einbezogen (oder ausgeschlossen), die an den Aufrufer zurückgesendet werden.

Um Dokumente in Suchergebnissen basierend auf den Benutzergruppen zu filtern, die die Anfrage stellen, folgen Sie diesen Schritten.

Schritt 1: Abrufen der Gruppenbezeichner des Benutzers

Wenn die Gruppen des Benutzers noch nicht zwischengespeichert wurden oder der Cache abgelaufen ist, geben Sie die Gruppen Anforderung aus.

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

Schritt 2: Verfassen der Suchanforderung

Wenn Sie über die Gruppenmitgliedschaft des Benutzers verfügen, können Sie die Suchanforderung mit den entsprechenden Filterwerten ausstellen.

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

Schritt 3: Behandeln der Ergebnisse

Die Antwort enthält eine gefilterte Liste von Dokumenten, die aus denen besteht, die der Benutzer zum Anzeigen berechtigt ist. Je nachdem, wie Sie die Suchergebnisseite erstellen, sollten Sie visuelle Hinweise einfügen, um die gefilterte Ergebnismenge widerzuspiegeln.

Erkenntnisse

In dieser exemplarischen Vorgehensweise haben Sie ein Muster für die Verwendung von Benutzeranmeldungen zum Filtern von Dokumenten in Azure AI Search-Ergebnissen kennengelernt und die Ergebnisse von Dokumenten gekürzt, die nicht mit dem für die Anforderung bereitgestellten Filter übereinstimmen.