Sdílet prostřednictvím


Filtry zabezpečení pro oříznutí výsledků hledání Azure AI pomocí MAzure Active Directory

Tento článek ukazuje, jak používat identity zabezpečení 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ů
  • 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).

Abyste mohli vytvářet uživatele, skupiny a přidružení, musíte mít oprávnění správce tenanta (vlastník nebo správce).

Vaše aplikace musí být také zaregistrovaná jako víceklientová aplikace, jak je popsáno v následujícím postupu.

Registrace aplikace v Azure Active Directory

Tento krok integruje vaši aplikaci se službou Azure Active Directory za účelem 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 Azure Active Directory.

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

  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 ke službě Azure Active Directory 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 Azure Active Directory. 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, aby se při vydání žádosti o vyhledávání vrátily skupiny z mezipaměti a uložily se zpáteční interval. Rozhraní API služby 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ů.

Shrnutí

V tomto názorném postupu jste se naučili vzor pro použití přihlašování uživatelů 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 zadanému v požadavku.