Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье демонстрируется, как использовать идентификаторы безопасности вместе с фильтрами в службе "Поиск ИИ Azure", чтобы отфильтровать результаты поиска на основе членства в группах пользователей.
В этой статье рассматриваются следующие задачи:
- Создание групп и пользователей
- Связывание пользователя с созданной группой
- Кэшировать новые группы
- Индексирование документов с связанными группами
- Выдача поискового запроса с фильтром идентификаторов групп
Необходимые условия
Ваш индекс в Azure AI Search должен иметь поле безопасности для хранения списка идентификационных данных групп, имеющих доступ для чтения к документу. В этом случае предполагается один-к-одному связь между защищаемым элементом (например, заявлением в колледж) и полем безопасности, указывающим, кто имеет доступ к этому элементу (сотрудники приёмной комиссии).
Для создания пользователей, групп и связей необходимо иметь разрешения администратора клиента (владельца или администратора).
Приложение также должно быть зарегистрировано в качестве многопользовательского приложения, как описано в следующей процедуре.
Регистрация приложения в Azure Active Directory
Этот шаг интегрирует приложение с Azure Active Directory для принятия входов учетных записей пользователей и групп. Если вы не являетесь администратором клиента в организации, может потребоваться создать новый клиент, чтобы выполнить следующие действия.
На портале Azureнайдите клиент Azure Active Directory.
Слева в разделе управлениевыберите Регистрация приложений, а затем выберите Создать регистрацию.
Присвойте регистрации имя, возможно, имя, аналогичное имени приложения поиска. Дополнительные сведения о других необязательных свойствах см. в этой статье.
Выберите Зарегистрировать.
После создания регистрации приложения скопируйте идентификатор приложения (клиента). Вам потребуется предоставить эту строку приложению.
Если вы выполняете пошаговый процесс в DotNetHowToSecurityTrimming, вставьте данное значение в файл app.config.
Скопируйте идентификатор каталога (арендатора).
Слева выберите разрешения API, а затем выберите Добавить разрешение.
Выберите Microsoft Graph и выберите Делегированные разрешения.
Найдите и добавьте следующие делегированные разрешения:
- Directory.ReadWrite.All
- Group.ReadWrite.All
- Пользователь.ЧтениеЗапись.Все
Microsoft Graph предоставляет API, который обеспечивает программный доступ к Azure Active Directory через REST API. В примере кода для этого пошагового руководства используются разрешения для вызова API Microsoft Graph для создания групп, пользователей и связей. API также используются для кэширования идентификаторов групп для ускорения фильтрации.
Выберите предоставить согласие администратора для арендатора, чтобы завершить процесс согласия.
Создание пользователей и групп
Если вы добавляете поиск в установленное приложение, возможно, у вас есть идентификаторы пользователей и групп в Azure Active Directory. В этом случае можно пропустить следующие три шага.
Однако если у вас нет существующих пользователей, вы можете использовать API Microsoft Graph для создания субъектов безопасности. В следующих фрагментах кода показано, как создавать идентификаторы, которые становятся значениями данных для поля безопасности в индексе поиска ИИ Azure. "В нашей гипотетической заявке на прием в колледж это были бы идентификаторы безопасности для сотрудников приема."
Членство пользователей и групп может быть очень гибким, особенно в крупных организациях. Код, создающий удостоверения пользователей и групп, должен выполняться достаточно часто, чтобы учитывать изменения в членстве в организации. Аналогичным образом индекс поиска ИИ Azure требует аналогичного расписания обновления, чтобы отразить текущее состояние разрешенных пользователей и ресурсов.
Шаг 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. Кэширование идентификаторов групп
При необходимости, чтобы уменьшить задержку в сети, можно кэшировать ассоциации пользователей и групп, чтобы при выдаче поискового запроса группы возвращались из кэша, что избавляет от дополнительного запроса к серверу. Вы можете использовать API пакетной службы для отправки одного http-запроса с несколькими пользователями и создания кэша.
Microsoft Graph предназначен для обработки большого объема запросов. Если происходит подавляющее число запросов, Microsoft Graph завершает запрос с кодом состояния HTTP 429. Дополнительные сведения см. в разделе регулирования Microsoft Graph.
Индексировать документ по разрешенным группам
Операции запросов в поиске ИИ Azure выполняются по индексу поиска ИИ Azure. На этом шаге операция индексирования импортирует данные, доступные для поиска, в индекс, включая идентификаторы, используемые в качестве фильтров безопасности.
Поиск по искусственному интеллекту Azure не проверяет подлинность удостоверений пользователей или предоставляет логику для определения содержимого, которое пользователь имеет разрешение на просмотр. В сценарии использования обрезки безопасности предполагается, что вы предоставляете связь между конфиденциальным документом и идентификатором группы, имеющей доступ к данному документу и импортированным в индекс поиска.
В гипотетическом примере тело запроса PUT к индексу поиска Azure AI будет включать эссе или выписку оценок кандидата вместе с идентификатором группы, имеющей разрешение на просмотр этого содержимого.
В универсальном примере кода, используемом в этом пошаговом руководстве, действие индекса может выглядеть следующим образом:
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 Search с таким идентификатором в поле безопасности включаются (или исключаются) в результаты поиска, отправляемые обратно вызывающей стороне.
Чтобы отфильтровать документы, возвращаемые в результатах поиска, на основе групп пользователя, выдавшего запрос, просмотрите следующие действия.
Шаг 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. Обработка результатов
Ответ содержит отфильтрованный список документов, состоящий из тех, которые у пользователя есть разрешение на просмотр. В зависимости от того, как вы создаете страницу результатов поиска, может потребоваться включить визуальные подсказки для отражения отфильтрованного результированного набора.
Выносы
В этом пошаговом руководстве вы узнали шаблон использования пользовательских входов для фильтрации документов в результатах поиска ИИ Azure, обрезая результаты документов, которые не соответствуют фильтру, предоставленному в запросе.