Säkerhetsfilter för att trimma resultat i Azure AI Search

Azure AI Search ger inte inbyggda behörigheter på dokumentnivå och kan inte variera sökresultat från samma index efter användarbehörighet. Som en lösning kan du skapa ett filter som trimmar sökresultaten baserat på en sträng som innehåller en grupp eller användaridentitet.

I den här artikeln beskrivs ett mönster för säkerhetsfiltrering med följande steg:

  • Montera källdokument med det innehåll som krävs
  • Skapa ett fält för huvudidentifierarna
  • Skicka dokumenten till sökindexet för indexering
  • Fråga indexet med search.in filterfunktionen

Den avslutas med länkar till demonstrationer och exempel som ger praktisk inlärning. Vi rekommenderar att du läser den här artikeln först för att förstå mönstret.

Om mönstret för säkerhetsfilter

Även om Azure AI Search inte integreras med säkerhetsundersystem för åtkomst till innehåll i ett index, upptäcker många kunder som har säkerhetskrav på dokumentnivå att filter kan uppfylla deras behov.

I Azure AI Search är ett säkerhetsfilter ett vanligt OData-filter som innehåller eller exkluderar ett sökresultat baserat på en sträng som består av ett säkerhetsobjekt. Det finns ingen autentisering eller auktorisering via säkerhetsobjektet. Huvudnamnet är bara en sträng som används i ett filteruttryck för att inkludera eller exkludera ett dokument från sökresultaten.

Det finns flera sätt att uppnå säkerhetsfiltrering. Ett sätt är genom en komplicerad disjunction av likhetsuttryck: till exempel Id eq 'id1' or Id eq 'id2', och så vidare. Den här metoden är felbenägen, svår att underhålla och i fall där listan innehåller hundratals eller tusentals värden, minskar svarstiden för frågor med många sekunder.

En bättre lösning är att search.in använda funktionen för säkerhetsfilter enligt beskrivningen i den här artikeln. Om du använder search.in(Id, 'id1, id2, ...') i stället för ett likhetsuttryck kan du förvänta dig svarstider på undersekunder.

Förutsättningar

  • Ett strängfält som innehåller en grupp eller användaridentitet, till exempel en Microsoft Entra-objektidentifierare.

  • Andra fält i samma dokument bör ange det innehåll som är tillgängligt för den gruppen eller användaren. I följande JSON-dokument innehåller fälten "security_id" identiteter som används i ett säkerhetsfilter, och namn, lön och civilstånd inkluderas om anroparens identitet matchar dokumentets "security_id".

    {  
        "Employee-1": {  
            "employee_id": "100-1000-10-1-10000-1",
            "name": "Abram",   
            "salary": 75000,   
            "married": true,
            "security_id": "alphanumeric-object-id-for-employee-1"
        },
        "Employee-2": {  
            "employee_id": "200-2000-20-2-20000-2",
            "name": "Adams",   
            "salary": 75000,   
            "married": true,
            "security_id": "alphanumeric-object-id-for-employee-2"
        } 
    }  
    

Skapa säkerhetsfält

I sökindexet i fältsamlingen behöver du ett fält som innehåller gruppen eller användaridentiteten, ungefär som det fiktiva fältet "security_id" i föregående exempel.

  1. Lägg till ett säkerhetsfält som en Collection(Edm.String).

  2. Ange fältets filterable attribut inställt på true.

  3. Ange fältets retrievable attribut till false så att det inte returneras som en del av sökbegäran.

  4. Index kräver en dokumentnyckel. Fältet "file_id" uppfyller det kravet.

  5. Index bör också innehålla sökbart och hämtningsbart innehåll. Fälten "file_name" och "file_description" representerar det i det här exemplet.

    Följande indexschema uppfyller fältkraven. Dokument som du indexar i Azure AI Search bör ha värden för alla dessa fält, inklusive "group_ids". För dokumentet med file_name "secured_file_b" har endast användare som tillhör grupp-ID:t "group_id1" eller "group_id2" läsbehörighet till filen.

    POST https://[search service].search.windows.net/indexes/securedfiles/docs/index?api-version=2024-07-01
    {
         "name": "securedfiles",  
         "fields": [
             {"name": "file_id", "type": "Edm.String", "key": true, "searchable": false },
             {"name": "file_name", "type": "Edm.String", "searchable": true },
             {"name": "file_description", "type": "Edm.String", "searchable": true },
             {"name": "group_ids", "type": "Collection(Edm.String)", "filterable": true, "retrievable": false }
         ]
     }
    

Skicka data till ditt index med hjälp av REST-API:et

Fyll i ditt sökindex med dokument som innehåller värden för varje fält i fältsamlingen, inklusive värden för säkerhetsfältet. Azure AI Search tillhandahåller inte API:er eller funktioner för att fylla i säkerhetsfältet specifikt. Flera av exemplen som visas i slutet av den här artikeln förklarar dock tekniker för att fylla i det här fältet.

I Azure AI Search är metoderna för att läsa in data:

  • En enda push- eller pull-åtgärd (indexerare) som importerar dokument som fyllts i med alla fält
  • Flera push- eller pull-åtgärder. Så länge sekundära importåtgärder riktar sig mot rätt dokumentidentifierare kan du läsa in fält individuellt via flera importer.

I följande exempel visas en enda HTTP POST-begäran till dokumentsamlingen för ditt indexs URL-slutpunkt (se Dokument - Index). Brödtexten i HTTP-begäran är en JSON-återgivning av de dokument som ska indexeras:

POST https://[search service].search.windows.net/indexes/securedfiles/docs/index?api-version=2024-07-01
{
    "value": [
        {
            "@search.action": "upload",
            "file_id": "1",
            "file_name": "secured_file_a",
            "file_description": "File access is restricted to Human Resources.",
            "group_ids": ["group_id1"]
        },
        {
            "@search.action": "upload",
            "file_id": "2",
            "file_name": "secured_file_b",
            "file_description": "File access is restricted to Human Resources and Recruiting.",
            "group_ids": ["group_id1", "group_id2"]
        },
        {
            "@search.action": "upload",
            "file_id": "3",
            "file_name": "secured_file_c",
            "file_description": "File access is restricted to Operations and Logistics.",
            "group_ids": ["group_id5", "group_id6"]
        }
    ]
}

Om du behöver uppdatera ett befintligt dokument med listan över grupper kan du använda merge åtgärden eller mergeOrUpload :

{
    "value": [
        {
            "@search.action": "mergeOrUpload",
            "file_id": "3",
            "group_ids": ["group_id7", "group_id8", "group_id9"]
        }
    ]
}

Tillämpa säkerhetsfiltret i frågan

För att trimma dokument baserat på group_ids åtkomst bör du utfärda en sökfråga med ett group_ids/any(g:search.in(g, 'group_id1, group_id2,...')) filter, där "group_id1, group_id2,..." är de grupper som utfärdaren av sökbegäran tillhör.

Det här filtret matchar alla dokument som fältet group_ids innehåller en av de angivna identifierarna för. Fullständig information om hur du söker i dokument med Hjälp av Azure AI Search finns i Sökdokument.

Det här exemplet visar hur du konfigurerar frågor med hjälp av en POST-begäran.

Utfärda HTTP POST-begäran och ange filtret i begärandetexten:

POST https://[service name].search.windows.net/indexes/securedfiles/docs/search?api-version=2024-07-01

{
   "filter":"group_ids/any(g:search.in(g, 'group_id1, group_id2'))"  
}

Du bör få tillbaka dokumenten där group_ids innehåller antingen "group_id1" eller "group_id2". Med andra ord får du de dokument som utfärdaren av begäran har läsbehörighet till.

{
 [
   {
    "@search.score":1.0,
     "file_id":"1",
     "file_name":"secured_file_a",
   },
   {
     "@search.score":1.0,
     "file_id":"2",
     "file_name":"secured_file_b"
   }
 ]
}

Nästa steg

I den search.in() här artikeln beskrivs ett mönster för filtrering av resultat baserat på användaridentitet och funktion. Du kan använda den här funktionen för att skicka in huvudidentifierare för den begärande användaren för att matcha mot huvudidentifierare som är associerade med varje måldokument. När en sökbegäran hanteras search.in filtrerar funktionen ut sökresultat som ingen av användarens huvudnamn har läsbehörighet för. Huvudidentifierarna kan representera saker som säkerhetsgrupper, roller eller till och med användarens egen identitet.

För fler exempel, demonstrationer och videor: