Delen via


Beveiligingsfilters voor het bijsnijden van Azure AI Search-resultaten met behulp van MAzure Active Directory

In dit artikel wordt gedemonstreert hoe u beveiligingsidentiteiten gebruikt in combinatie met filters in Azure AI Search om zoekresultaten te beperken op basis van lidmaatschap van gebruikersgroepen.

Dit artikel behandelt de volgende taken:

  • Groepen en gebruikers maken
  • De gebruiker koppelen aan de groep die u hebt gemaakt
  • De nieuwe groepen in de cache opslaan
  • Documenten indexeren met gekoppelde groepen
  • Een zoekaanvraag uitgeven met het filter groeps-id's

Vereisten

Uw index in Azure AI Search moet een beveiligingsveld hebben om de lijst met groepsidentiteiten met leestoegang tot het document op te slaan. In deze use case wordt ervan uitgegaan dat er een een-op-een-correspondentie tussen een beveiligbaar item (zoals de collegetoepassing van een persoon) en een beveiligingsveld wordt opgegeven dat aangeeft wie toegang heeft tot dat item (toelatingspersoneel).

U moet tenantbeheerdersmachtigingen (eigenaar of beheerder) hebben om gebruikers, groepen en koppelingen te maken.

Uw toepassing moet ook worden geregistreerd als een multitenant-app, zoals beschreven in de volgende procedure.

Uw toepassing registreren bij Azure Active Directory

Deze stap integreert uw toepassing met Azure Active Directory voor het accepteren van aanmeldingen van gebruikers- en groepsaccounts. Als u geen tenantbeheerder in uw organisatie bent, moet u mogelijk een nieuwe tenant maken om de volgende stappen uit te voeren.

  1. Zoek in Azure Portal de Azure Active Directory-tenant.

  2. Selecteer aan de linkerkant onder Beheren App-registraties en selecteer vervolgens Nieuwe registratie.

  3. Geef de registratie een naam, misschien een naam die vergelijkbaar is met de naam van de zoektoepassing. Raadpleeg dit artikel voor informatie over andere optionele eigenschappen.

  4. Selecteer Registreren.

  5. Nadat de app-registratie is gemaakt, kopieert u de toepassings-id (client). U moet deze tekenreeks opgeven voor uw toepassing.

    Als u de DotNetHowToSecurityTrimming doorloopt, plakt u deze waarde in het bestand app.config .

  6. Kopieer de map-id (tenant).

  7. Selecteer aan de linkerkant API-machtigingen en selecteer vervolgens Een machtiging toevoegen.

  8. Selecteer Microsoft Graph en selecteer vervolgens Gedelegeerde machtigingen.

  9. Zoek en voeg vervolgens de volgende gedelegeerde machtigingen toe:

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

    Microsoft Graph biedt een API waarmee programmatische toegang tot Azure Active Directory mogelijk is via een REST API. In het codevoorbeeld voor dit scenario worden de machtigingen gebruikt om de Microsoft Graph API aan te roepen voor het maken van groepen, gebruikers en koppelingen. De API's worden ook gebruikt voor het opslaan van groeps-id's voor snellere filtering.

  10. Selecteer Beheerderstoestemming verlenen voor tenant om het toestemmingsproces te voltooien.

Gebruikers en groepen maken

Als u een zoekopdracht toevoegt aan een bestaande toepassing, hebt u mogelijk bestaande gebruikers- en groeps-id's in Azure Active Directory. In dit geval kunt u de volgende drie stappen overslaan.

Als u echter geen bestaande gebruikers hebt, kunt u Microsoft Graph-API's gebruiken om de beveiligingsprinciplen te maken. De volgende codefragmenten laten zien hoe u id's genereert, die gegevenswaarden worden voor het beveiligingsveld in uw Azure AI Search-index. In onze hypothetische college-toelatingsaanvraag zou dit de beveiligings-id's voor toelatingspersoneel zijn.

Het lidmaatschap van gebruikers en groepen kan erg vloeiend zijn, met name in grote organisaties. Code waarmee gebruikers- en groepsidentiteiten worden gebouwd, moet vaak genoeg worden uitgevoerd om wijzigingen in het lidmaatschap van de organisatie op te halen. Op dezelfde manier vereist uw Azure AI Search-index een vergelijkbaar updateschema om de huidige status van toegestane gebruikers en resources weer te geven.

Stap 1: Groep maken

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

Stap 2: Gebruiker maken

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

Stap 3: Gebruiker en groep koppelen

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

Stap 4: De groeps-id's in de cache opslaan

Als u de netwerklatentie wilt verminderen, kunt u de koppelingen van gebruikersgroepen in de cache opslaan, zodat wanneer een zoekaanvraag wordt uitgegeven, groepen worden geretourneerd uit de cache, waardoor een retour wordt opgeslagen. U kunt Batch API gebruiken om één HTTP-aanvraag met meerdere gebruikers te verzenden en de cache te bouwen.

Microsoft Graph is ontworpen voor verwerking van een zeer groot aantal aanvragen. Als er een overweldigend aantal aanvragen optreedt, mislukt de aanvraag met HTTP-statuscode 429. Zie Microsoft Graph-beperking voor meer informatie.

Indexdocument met hun toegestane groepen

Querybewerkingen in Azure AI Search worden uitgevoerd via een Azure AI Search-index. In deze stap importeert een indexeringsbewerking doorzoekbare gegevens in een index, inclusief de id's die worden gebruikt als beveiligingsfilters.

Azure AI Search verifieert geen gebruikersidentiteiten of biedt logica voor het vaststellen van welke inhoud een gebruiker gemachtigd is om weer te geven. In het gebruiksvoorbeeld voor beveiligingsbeperkingen wordt ervan uitgegaan dat u de koppeling opgeeft tussen een gevoelig document en de groeps-id die toegang tot dat document hebben, intact is geïmporteerd in een zoekindex.

In het hypothetische voorbeeld bevat de hoofdtekst van de PUT-aanvraag in een Azure AI Search-index een college-essay of transcriptie van een aanvrager, samen met de groeps-id die gemachtigd is om die inhoud weer te geven.

In het algemene voorbeeld dat in het codevoorbeeld voor dit scenario wordt gebruikt, kan de indexactie er als volgt uitzien:

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

Een zoekaanvraag uitgeven

Voor beveiligingsbeperkingen zijn de waarden in het beveiligingsveld in de index statische waarden die worden gebruikt voor het opnemen of uitsluiten van documenten in zoekresultaten. Als de groeps-id voor toelatingen bijvoorbeeld 'A11B22C33D44-E55F66G77-H88I99JKK' is, worden alle documenten in een Azure AI Search-index met die id in het beveiligingsveld opgenomen (of uitgesloten) in de zoekresultaten die naar de beller worden teruggestuurd.

Als u documenten wilt filteren die worden geretourneerd in zoekresultaten op basis van groepen van de gebruiker die de aanvraag uitgeeft, bekijkt u de volgende stappen.

Stap 1: groeps-id's van gebruikers ophalen

Als de groepen van de gebruiker nog niet in de cache zijn opgeslagen of als de cache is verlopen, geeft u de groepsaanvraag uit.

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

Stap 2: De zoekaanvraag opstellen

Ervan uitgaande dat u het groepslidmaatschap van de gebruiker hebt, kunt u de zoekaanvraag uitgeven met de juiste filterwaarden.

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

Stap 3: de resultaten afhandelen

Het antwoord bevat een gefilterde lijst met documenten, bestaande uit documenten die de gebruiker gemachtigd heeft om te bekijken. Afhankelijk van hoe u de pagina met zoekresultaten samenstelt, wilt u mogelijk visuele aanwijzingen opnemen om de gefilterde resultatenset weer te geven.

Opgedane kennis

In dit scenario hebt u een patroon geleerd voor het gebruik van aanmeldingen van gebruikers om documenten te filteren in Azure AI Search-resultaten, waarbij u de resultaten van documenten die niet overeenkomen met het filter dat is opgegeven in de aanvraag, wordt ingekort.