使用 Microsoft Entra 租使用者和身分識別來修剪 Azure AI 搜尋結果的安全性篩選

本文示範如何使用 Microsoft Entra 安全性身分識別與 Azure AI 搜尋中的篩選條件,根據使用者群組成員資格來修剪搜尋結果。

本文涵蓋下列工作:

  • 建立 Microsoft Entra 群組和使用者
  • 將使用者與您建立的群組產生關聯
  • 快取新的群組
  • 為具有相關聯群組的文件編製索引
  • 發出具有群組標識碼篩選條件的搜尋要求

必要條件

Azure AI 搜尋服務中的索引必須具有 安全性欄位 ,才能儲存具有檔讀取許可權的群組身分識別清單。 此使用案例假設安全性實體專案(例如個人的大學申請)與安全性欄位之間有一對一的對應,指定誰可以存取該專案(招生人員)。

您必須擁有 Microsoft Entra 系統管理員許可權(擁有者或系統管理員),才能建立使用者、群組和關聯。

您的應用程式也必須向 Microsoft Entra ID 註冊為多租用戶應用程式,如下列程式所述。

向 Microsoft Entra ID 註冊應用程式

此步驟會整合您的應用程式與 Microsoft Entra ID,以便接受使用者和組帳戶的登入。 如果您不是組織中的租用戶系統管理員,您可能需要 建立新的租用戶 來執行下列步驟。

  1. Azure 入口網站 中,尋找 Microsoft Entra ID 租使用者。

  2. 在左側的 [管理] 底,選取 [應用程式註冊],然後選取 [新增註冊]。

  3. 為註冊指定名稱,可能是類似搜尋應用程式名稱的名稱。 如需其他選擇性屬性的相關信息,請參閱這篇文章

  4. 選取註冊

  5. 建立應用程式註冊之後,請複製應用程式 (用戶端) 識別碼。 您必須將此字串提供給您的應用程式。

    如果您要逐步執行 DotNetHowToSecurityTrimming,請將此值貼到 app.config 檔案中。

  6. 複製目錄 (租使用者) 識別碼。

    Screenshot of the application ID in the Essentials section.

  7. 在左側選取 [API 許可權],然後選取 [新增許可權]。

  8. 選取 [Microsoft Graph ],然後選取 [委派的許可權]。

  9. 搜尋 ,然後新增下列委派的許可權:

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

    Microsoft Graph 提供 API,允許透過 REST API 以程式設計方式存取 Microsoft Entra ID。 本逐步解說的程式代碼範例會使用許可權來呼叫 Microsoft Graph API 來建立群組、使用者和關聯。 API 也可用來快取群組標識碼,以加快篩選速度。

  10. 選取 [ 授與租使用者的 管理員同意] 以完成同意程式。

建立使用者與群組

如果您要將搜尋新增至已建立的應用程式,您可能會在 Microsoft Entra ID 中擁有現有的使用者和群組識別碼。 在此情況下,您可以略過接下來的三個步驟。

不過,如果您沒有現有的使用者,您可以使用 Microsoft Graph API 來建立安全性主體。 下列代碼段示範如何產生標識符,這會成為 Azure AI 搜尋服務索引中安全性欄位的數據值。 在我們的假設性大學招生申請中,這將是招生人員的安全標識符。

使用者和群組成員資格可能非常流暢,特別是在大型組織中。 建置使用者和群組身分識別的程式代碼應該經常執行,以取得組織成員資格的變更。 同樣地,您的 Azure AI 搜尋索引需要類似的更新排程,以反映允許使用者和資源目前的狀態。

步驟 1: 建立群組

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

步驟 2: 建立使用者

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

步驟 3:建立使用者和群組的關聯

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

步驟 4:快取群組標識符

或者,若要減少網路等待時間,您可以快取使用者群組關聯,以便在發出搜尋要求時,從快取傳回群組,儲存往返 Microsoft Entra ID 的往返。 您可以使用 Microsoft Entra Batch API 來傳送具有多個使用者的單一 Http 要求,並建置快取。

Microsoft Graph 依設計可處理大量的要求。 如果發生大量要求,Microsoft Graph 會因為 HTTP 狀態代碼 429 而失敗要求。 如需詳細資訊,請參閱 Microsoft Graph 節流。

使用其允許的群組編製檔索引

Azure AI 搜尋中的查詢作業會透過 Azure AI 搜尋索引執行。 在此步驟中,索引作業會將可搜尋的數據匯入索引,包括做為安全性篩選器使用的標識符。

Azure AI 搜尋不會驗證使用者身分識別,或提供邏輯來建立使用者有權檢視的內容。 安全性修剪的使用案例假設您在敏感性檔與可存取該檔的群組標識符之間提供關聯,且完整匯入搜尋索引。

在假設的範例中,Azure AI 搜尋索引上 PUT 要求的主體會包含申請人的大學論文或文字記錄,以及有權檢視該內容的群組標識符。

在此逐步解說的程式代碼範例中使用的泛型範例中,索引動作看起來可能如下所示:

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

發出搜尋要求

基於安全性調整目的,索引中安全性欄位中的值是靜態值,用於在搜尋結果中包含或排除檔。 例如,如果許可的群組標識符是“A11B22C33D44-E55F66G77-H88I99JKK”,則 Azure AI 搜尋服務索引中具有該標識符的任何檔都包含在傳送回給呼叫者的搜尋結果中(或排除)。

若要根據發出要求的使用者群組來篩選搜尋結果中傳回的檔,請檢閱下列步驟。

步驟 1:擷取使用者的群組標識碼

如果使用者的群組尚未快取,或快取已過期,請發出 群組 要求。

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

步驟 2:撰寫搜尋要求

假設您擁有使用者的群組成員資格,您可以使用適當的篩選值發出搜尋要求。

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

步驟 3:處理結果

回應包含篩選的檔案清單,其中包含用戶有權檢視的檔。 根據建構搜尋結果頁面的方式,您可能想要包含視覺提示來反映篩選的結果集。

下一步

在本逐步解說中,您已瞭解如何使用 Microsoft Entra 登入來篩選 Azure AI 搜尋結果中的檔,並修剪不符合要求上所提供篩選條件的文件結果。 如需可能更簡單或重新流覽其他安全性功能的替代模式,請參閱下列連結。