Filtry zabezpečení pro oříznutí výsledků služby Azure AI Search pomocí tenantů a identit Microsoft Entra

Tento článek ukazuje, jak používat identity zabezpečení Microsoft Entra společně s filtry ve službě Azure AI Search k oříznutí výsledků hledání na základě členství ve skupině uživatelů.

Tento článek se zabývá následujícími úkony:

  • Vytváření skupin a uživatelů Microsoft Entra
  • Přidružení uživatele ke skupině, kterou jste vytvořili
  • Ukládání nových skupin do mezipaměti
  • Indexování dokumentů s přidruženými skupinami
  • Vydání žádosti o vyhledávání s filtrem identifikátorů skupin

Požadavky

Index ve službě Azure AI Search musí mít pole zabezpečení pro uložení seznamu identit skupin, které mají k dokumentu přístup pro čtení. Tento případ použití předpokládá korespondenci 1:1 mezi zabezpečitelnou položkou (například aplikací na vysoké škole jednotlivce) a polem zabezpečení určujícím, kdo má k této položce přístup (pracovníci přístupu).

K vytváření uživatelů, skupin a přidružení musíte mít oprávnění správce Microsoft Entra (vlastník nebo správce).

Vaše aplikace musí být také zaregistrovaná u Microsoft Entra ID jako víceklientských aplikací, jak je popsáno v následujícím postupu.

Registrace aplikace pomocí Microsoft Entra ID

Tento krok integruje vaši aplikaci s MICROSOFT Entra ID pro účely přijetí přihlášení uživatelských a skupinových účtů. Pokud nejste správcem tenanta ve vaší organizaci, možná budete muset vytvořit nového tenanta , abyste mohli provést následující kroky.

  1. Na webu Azure Portal vyhledejte tenanta Microsoft Entra ID.

  2. Na levé straně v části Spravovat vyberte Registrace aplikací a pak vyberte Nová registrace.

  3. Pojmenujte registraci, třeba název podobný názvu vyhledávací aplikace. Informace o dalších volitelných vlastnostech najdete v tomto článku .

  4. Vyberte Zaregistrovat.

  5. Po vytvoření registrace aplikace zkopírujte ID aplikace (klienta). Tento řetězec budete muset zadat vaší aplikaci.

    Pokud procházíte dotNetHowToSecurityTrimming, vložte tuto hodnotu do souboru app.config .

  6. Zkopírujte ID adresáře (tenanta).

    Screenshot of the application ID in the Essentials section.

  7. Vlevo vyberte oprávnění rozhraní API a pak vyberte Přidat oprávnění.

  8. Vyberte Microsoft Graph a pak vyberte Delegovaná oprávnění.

  9. Vyhledejte a přidejte následující delegovaná oprávnění:

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

    Microsoft Graph poskytuje rozhraní API, které umožňuje programový přístup k ID Microsoft Entra prostřednictvím rozhraní REST API. Ukázka kódu pro tento názorný postup používá oprávnění k volání rozhraní Microsoft Graph API pro vytváření skupin, uživatelů a přidružení. Rozhraní API se také používají k ukládání identifikátorů skupin do mezipaměti pro rychlejší filtrování.

  10. Výběrem možnosti Udělit souhlas správce tenantovi dokončete proces souhlasu.

Vytváření uživatelů a skupin

Pokud přidáváte vyhledávání do zavedené aplikace, můžete mít existující identifikátory uživatelů a skupin v Microsoft Entra ID. V takovém případě můžete přeskočit další tři kroky.

Pokud ale nemáte existující uživatele, můžete k vytvoření objektů zabezpečení použít rozhraní Microsoft Graph API. Následující fragmenty kódu ukazují, jak generovat identifikátory, které se stanou hodnotami dat pro pole zabezpečení ve vašem indexu Azure AI Search. V naší hypotetické aplikaci pro přijetí na vysoké škole by to byly bezpečnostní identifikátory pro zaměstnance přijímacích pracovníků.

Členství uživatelů a skupin může být velmi proměnlivé, zejména ve velkých organizacích. Kód, který vytváří identity uživatelů a skupin, by se měl spouštět dostatečně často, aby mohl vyzvednout změny ve členství v organizaci. Stejně tak index Azure AI Search vyžaduje podobný plán aktualizace, který odráží aktuální stav povolených uživatelů a prostředků.

Krok 1: Vytvoření skupiny

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

Krok 2: Vytvoření uživatele

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

Krok 3: Přidružení uživatele a skupiny

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

Krok 4: Uložení identifikátorů skupin do mezipaměti

Pokud chcete snížit latenci sítě, můžete přidružení skupin uživatelů ukládat do mezipaměti tak, aby se při vydání žádosti o vyhledávání vrátily skupiny z mezipaměti a uložily se zaokrouhlování do Microsoft Entra ID. Rozhraní API služby Microsoft Entra Batch můžete použít k odeslání jednoho požadavku HTTP s více uživateli a vytvoření mezipaměti.

Microsoft Graph je navržený tak, aby zvládal velký počet požadavků. Pokud dojde k zahlcení počtu požadavků, Microsoft Graph požadavek selže se stavovým kódem HTTP 429. Další informace najdete v tématu Omezení Microsoft Graphu.

Indexování dokumentu s povolenými skupinami

Operace dotazů ve službě Azure AI Search se spouští přes index služby Azure AI Search. V tomto kroku operace indexování importuje prohledávatelná data do indexu, včetně identifikátorů použitých jako filtry zabezpečení.

Azure AI Search neověřuje identity uživatelů ani neposkytuje logiku pro stanovení obsahu, který má uživatel oprávnění k zobrazení. Případ použití pro oříznutí zabezpečení předpokládá, že poskytnete přidružení mezi citlivým dokumentem a identifikátorem skupiny, který má přístup k danému dokumentu, importovaný beze změny do indexu vyhledávání.

V hypotetickém příkladu by tělo požadavku PUT na index Azure AI Search zahrnovalo školní esej nebo přepis žadatele spolu s identifikátorem skupiny, který má oprávnění k zobrazení tohoto obsahu.

V obecném příkladu použitém v ukázce kódu pro tento názorný postup může akce indexu vypadat takto:

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

Vydání žádosti o vyhledávání

Pro účely oříznutí zabezpečení jsou hodnoty v poli zabezpečení v indexu statické hodnoty používané pro zahrnutí nebo vyloučení dokumentů ve výsledcích hledání. Pokud je například identifikátor skupiny pro přístup "A11B22C33D44-E55F66G77-H88I99JKK", všechny dokumenty v indexu služby Azure AI Search s tímto identifikátorem v poli zabezpečení jsou zahrnuté (nebo vyloučené) ve výsledcích hledání odesílaných zpět volajícímu.

Pokud chcete filtrovat dokumenty vrácené ve výsledcích hledání na základě skupin uživatelů, kteří žádost vydávají, projděte si následující kroky.

Krok 1: Načtení identifikátorů skupin uživatele

Pokud skupiny uživatele ještě nebyly uložené v mezipaměti nebo vypršela platnost mezipaměti, vyžádejte žádost o skupiny .

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

Krok 2: Vytvoření žádosti o vyhledávání

Za předpokladu, že máte členství ve skupinách uživatele, můžete vydat žádost o vyhledávání s příslušnými hodnotami filtru.

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

Krok 3: Zpracování výsledků

Odpověď obsahuje filtrovaný seznam dokumentů, který se skládá z těch, které má uživatel oprávnění k zobrazení. V závislosti na tom, jak vytváříte stránku výsledků hledání, můžete chtít zahrnout vizuální upozornění, která odpovídají filtrované sadě výsledků.

Další kroky

V tomto názorném postupu jste se naučili vzor pro použití přihlášení Microsoft Entra k filtrování dokumentů ve výsledcích služby Azure AI Search a ořezávání výsledků dokumentů, které neodpovídají filtru poskytnutému v požadavku. Alternativní vzor, který může být jednodušší nebo se můžete vrátit k dalším funkcím zabezpečení, najdete na následujících odkazech.