Dela via


Säkerhetsfilter för att trimma Azure AI-sökresultat med hjälp av MAzure Active Directory

Den här artikeln visar hur du använder säkerhetsidentiteter tillsammans med filter i Azure AI Search för att trimma sökresultat baserat på användargruppsmedlemskap.

Den här artikeln beskriver följande uppgifter:

  • Skapa grupper och användare
  • Associera användaren med den grupp som du har skapat
  • Cachelagrade de nya grupperna
  • Index dokument med associerade grupper
  • Utfärda en sökbegäran med filter för gruppidentifierare

Förutsättningar

Ditt index i Azure AI Search måste ha ett säkerhetsfält för att lagra listan över gruppidentiteter som har läsbehörighet till dokumentet. Det här användningsfallet förutsätter en en-till-en-korrespondens mellan ett skyddsbart objekt (till exempel en persons collegeprogram) och ett säkerhetsfält som anger vem som har åtkomst till det objektet (antagningspersonal).

Du måste ha behörighet som innehavaradministratör (ägare eller administratör) för att skapa användare, grupper och associationer.

Ditt program måste också registreras med som en app för flera klientorganisationer enligt beskrivningen i följande procedur.

Registrera ditt program med Azure Active Directory

Det här steget integrerar ditt program med Azure Active Directory i syfte att acceptera inloggningar för användar- och gruppkonton. Om du inte är klientadministratör i din organisation kan du behöva skapa en ny klientorganisation för att utföra följande steg.

  1. Leta reda på Azure Active Directory-klientorganisationen i Azure-portalen.

  2. Till vänster under Hantera väljer du Appregistreringar och sedan Ny registrering.

  3. Ge registreringen ett namn, kanske ett namn som liknar sökprogrammets namn. Mer information om andra valfria egenskaper finns i den här artikeln.

  4. Välj Registrera.

  5. När appregistreringen har skapats kopierar du program-ID:t (klient-ID:t). Du måste ange den här strängen för ditt program.

    Om du går igenom DotNetHowToSecurityTrimming klistrar du in det här värdet i filen app.config .

  6. Kopiera katalog-ID :t (klientorganisation).

  7. Till vänster väljer du API-behörigheter och sedan Lägg till en behörighet.

  8. Välj Microsoft Graph och välj sedan Delegerade behörigheter.

  9. Sök efter och lägg sedan till följande delegerade behörigheter:

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

    Microsoft Graph tillhandahåller ett API som ger programmatisk åtkomst till Azure Active Directory via ett REST-API. Kodexemplet för den här genomgången använder behörigheterna för att anropa Microsoft Graph API för att skapa grupper, användare och associationer. API:erna används också för att cachelagra gruppidentifierare för snabbare filtrering.

  10. Välj Bevilja administratörsmedgivande för klientorganisationen för att slutföra medgivandeprocessen.

Skapa användare och grupper

Om du lägger till sökning i ett etablerat program kan du ha befintliga användar- och gruppidentifierare i Azure Active Directory. I det här fallet kan du hoppa över de kommande tre stegen.

Men om du inte har befintliga användare kan du använda Microsoft Graph-API:er för att skapa säkerhetsobjekten. Följande kodfragment visar hur du genererar identifierare, som blir datavärden för säkerhetsfältet i ditt Azure AI Search-index. I vår hypotetiska antagningsansökan skulle detta vara säkerhetsidentifierarna för antagningspersonal.

Användar- och gruppmedlemskap kan vara mycket smidigt, särskilt i stora organisationer. Kod som skapar användar- och gruppidentiteter bör köras tillräckligt ofta för att hämta ändringar i organisationsmedlemskapet. På samma sätt kräver ditt Azure AI Search-index ett liknande uppdateringsschema för att återspegla den aktuella statusen för tillåtna användare och resurser.

Steg 1: Skapa grupp

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

Steg 2: Skapa användare

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

Steg 3: Associera användare och grupp

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

Steg 4: Cachelagrar gruppidentifierarna

Om du vill minska nätverksfördröjningen kan du cachelagrat användargruppsassociationer så att grupper returneras från cachen när en sökbegäran utfärdas, vilket sparar en tur och retur. Du kan använda Batch API för att skicka en enda Http-begäran med flera användare och skapa cacheminnet.

Microsoft Graph har utformats för att hantera stora volymer med begäranden. Om ett överväldigande antal begäranden inträffar misslyckas Microsoft Graph begäran med HTTP-statuskod 429. Mer information finns i Microsoft Graph-begränsning.

Indexdokument med sina tillåtna grupper

Frågeåtgärder i Azure AI Search körs över ett Azure AI Search-index. I det här steget importerar en indexeringsåtgärd sökbara data till ett index, inklusive de identifierare som används som säkerhetsfilter.

Azure AI Search autentiserar inte användaridentiteter eller tillhandahåller logik för att fastställa vilket innehåll en användare har behörighet att visa. Användningsfallet för säkerhetstrimning förutsätter att du anger associationen mellan ett känsligt dokument och gruppidentifieraren som har åtkomst till dokumentet som importerats intakt till ett sökindex.

I det hypotetiska exemplet skulle brödtexten i PUT-begäran om ett Azure AI Search-index innehålla en sökandes högskoleuppsats eller avskrift tillsammans med gruppidentifieraren som har behörighet att visa innehållet.

I det allmänna exemplet som används i kodexemplet för den här genomgången kan indexåtgärden se ut så här:

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

Utfärda en sökbegäran

För säkerhetstrimning är värdena i säkerhetsfältet i indexet statiska värden som används för att inkludera eller exkludera dokument i sökresultat. Om gruppidentifieraren för Antagningar till exempel är "A11B22C33D44-E55F66G77-H88I99JKK" inkluderas alla dokument i ett Azure AI Search-index med identifieraren i säkerhetsfältet (eller exkluderas) i sökresultaten som skickas tillbaka till anroparen.

Om du vill filtrera dokument som returneras i sökresultat baserat på grupper av användaren som utfärdar begäran läser du följande steg.

Steg 1: Hämta användarens gruppidentifierare

Om användarens grupper inte redan har cachelagrats eller om cachen har upphört att gälla utfärdar du gruppbegäran .

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

Steg 2: Skriv sökbegäran

Förutsatt att du har användarens gruppmedlemskap kan du utfärda sökbegäran med lämpliga filtervärden.

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

Steg 3: Hantera resultatet

Svaret innehåller en filtrerad lista med dokument som består av dokument som användaren har behörighet att visa. Beroende på hur du skapar sökresultatsidan kanske du vill inkludera visuella tips för att återspegla den filtrerade resultatuppsättningen.

Lärdomar

I den här genomgången har du lärt dig ett mönster för att använda användarinloggningar för att filtrera dokument i Azure AI-sökresultat och trimma resultatet av dokument som inte matchar filtret som anges i begäran.