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

Azure AI Search ger inte 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.

Den här artikeln beskriver ett mönster för säkerhetsfiltrering som innehåller 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

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 har många kunder som har säkerhetskrav på dokumentnivå upptäckt 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å ett matchande värde, förutom att kriterierna i ett säkerhetsfilter är 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

  • Fältet som innehåller grupp- eller användaridentitet måste vara en sträng med det filterbara attributet. Det bör vara en samling. Det bör inte tillåta null-värden.

  • 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": {  
            "id": "100-1000-10-1-10000-1",
            "name": "Abram",   
            "salary": 75000,   
            "married": true,
            "security_id": "10011"
        },
        "Employee-2": {  
            "id": "200-2000-20-2-20000-2",
            "name": "Adams",   
            "salary": 75000,   
            "married": true,
            "security_id": "20022"
        } 
    }  
    

    Kommentar

    Processen för att hämta huvudidentifierarna och mata in dessa strängar i källdokument som kan indexeras av Azure AI Search beskrivs inte i den här artikeln. Se dokumentationen för din identitetstjänstleverantör för hjälp med att hämta identifierare.

Skapa säkerhetsfält

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

  1. Lägg till ett säkerhetsfält som en Collection(Edm.String). Kontrollera att det har ett filterable attribut inställt true på så att sökresultat filtreras baserat på den åtkomst som användaren har. Om du till exempel anger group_ids fältet till ["group_id1, group_id2"] 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.

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

  2. Index kräver en dokumentnyckel. Fältet "file_id" uppfyller det kravet. Index bör också innehålla sökbart innehåll. Fälten "file_name" och "file_description" representerar det i det här exemplet.

    POST https://[search service].search.windows.net/indexes/securedfiles/docs/index?api-version=2023-11-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

Skicka en HTTP POST-begäran till dokumentsamlingen för indexets 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=2023-11-01

I begärandetexten anger du innehållet i dina dokument:

{
    "value": [
        {
            "@search.action": "upload",
            "file_id": "1",
            "file_name": "secured_file_a",
            "file_description": "File access is restricted to the 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:

POST https://[service name].search.windows.net/indexes/securedfiles/docs/search?api-version=2020-06-30
Content-Type: application/json  
api-key: [admin or query key]

Ange filtret i begärandetexten:

{
   "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.

Ett alternativt mönster baserat på Microsoft Entra-ID eller för att gå tillbaka till andra säkerhetsfunktioner finns i följande länkar.