Filtri di sicurezza per tagliare i risultati di Ricerca di Intelligenza artificiale di Azure con Azure Active Directory
Questo articolo illustra come usare le identità di sicurezza insieme ai filtri in Ricerca di intelligenza artificiale di Azure per ridurre i risultati della ricerca in base all'appartenenza ai gruppi di utenti.
Questo articolo illustra le attività seguenti:
- Creare gruppi e utenti
- Associare l'utente al gruppo creato
- Memorizzare nella cache i nuovi gruppi
- Indicizzare i documenti con i gruppi associati
- Eseguire una richiesta di ricerca con il filtro degli identificatori di gruppo
Prerequisiti
L'indice in Ricerca di intelligenza artificiale di Azure deve avere un campo di sicurezza per archiviare l'elenco delle identità di gruppo che hanno accesso in lettura al documento. Questo caso d'uso presuppone una corrispondenza uno-a-uno tra un elemento a protezione diretta (ad esempio un'applicazione universitaria di un individuo) e un campo di sicurezza che specifica chi può accedere a tale elemento (personale di ammissione).
È necessario disporre delle autorizzazioni di amministratore tenant (proprietario o amministratore) per creare utenti, gruppi e associazioni.
La tua applicazione deve anche essere registrata come applicazione multi-tenant, come descritto nella procedura seguente.
Registrare l'applicazione con Azure Active Directory
Questo passaggio integra l'applicazione con Azure Active Directory allo scopo di accettare gli accessi degli account utente e di gruppo. Se non si è un amministratore tenant nell'organizzazione, potrebbe essere necessario creare un nuovo tenant per eseguire la procedura seguente.
In portale di Azuretrovare il tenant di Azure Active Directory.
A sinistra, in Gestisci, selezionare Registrazioni appe quindi selezionare Nuova registrazione.
Assegnare un nome alla registrazione, ad esempio un nome simile al nome dell'applicazione di ricerca. Per informazioni su altre proprietà facoltative, vedere questo articolo.
Selezionare Registra.
Dopo aver creato la registrazione dell'app, copiare l'ID applicazione (client). Sarà necessario fornire questa stringa all'applicazione.
Se stai procedendo con DotNetHowToSecurityTrimming, incolla questo valore nel file app.config.
Copiare l'ID Directory (tenant).
A sinistra selezionare autorizzazioni API e quindi selezionare Aggiungi un'autorizzazione.
Selezionare Microsoft Graph e quindi selezionare Autorizzazioni delegate.
Cercare e quindi aggiungere le autorizzazioni delegate seguenti:
- Directory.ReadWrite.All
- Group.ReadWrite.All
- User.ReadWrite.All
Microsoft Graph fornisce un'API che consente l'accesso a livello di codice ad Azure Active Directory tramite un'API REST. L'esempio di codice per questa procedura dettagliata usa le autorizzazioni per chiamare l'API Microsoft Graph per la creazione di gruppi, utenti e associazioni. Le API vengono usate anche per memorizzare nella cache gli identificatori di gruppo per un filtro più rapido.
Selezionare Concedi consenso amministratore per il tenant per completare il processo di consenso.
Creare utenti e gruppi
Se si aggiunge la ricerca a un'applicazione stabilita, potrebbero essere presenti identificatori di utente e gruppo esistenti in Azure Active Directory. In questo caso, è possibile ignorare i tre passaggi successivi.
Tuttavia, se non si dispone di utenti esistenti, è possibile usare le API Microsoft Graph per creare gli oggetti di sicurezza. I frammenti di codice seguenti illustrano come generare identificatori, che diventano valori di dati per il campo di sicurezza nell'indice di Ricerca di intelligenza artificiale di Azure. Nella nostra ipotetica applicazione di ammissione universitaria, si tratta degli identificatori di sicurezza per il personale di ammissione.
L'appartenenza a utenti e gruppi potrebbe essere molto fluida, soprattutto nelle organizzazioni di grandi dimensioni. Il codice che compila identità utente e gruppo deve essere eseguito abbastanza spesso per raccogliere le modifiche nell'appartenenza all'organizzazione. Analogamente, l'indice di Ricerca intelligenza artificiale di Azure richiede una pianificazione di aggiornamento simile per riflettere lo stato corrente di utenti e risorse consentiti.
Passaggio 1: creare Gruppo
private static Dictionary<Group, List<User>> CreateGroupsWithUsers(string tenant)
{
Group group = new Group()
{
DisplayName = "My First Prog Group",
SecurityEnabled = true,
MailEnabled = false,
MailNickname = "group1"
};
Passaggio 2: Crea Utente
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
};
Passaggio 3: Associare utenti e gruppi
List<User> users = new List<User>() { user1, user2 };
Dictionary<Group, List<User>> groups = new Dictionary<Group, List<User>>() { { group, users } };
Passaggio 4: Memorizzare nella cache gli identificatori dei gruppi
Facoltativamente, per ridurre la latenza di rete, è possibile memorizzare nella cache le associazioni di gruppi di utenti in modo che, quando viene eseguita una richiesta di ricerca, i gruppi vengano restituiti dalla cache, salvando un round trip. È possibile usare API Batch per inviare una singola richiesta HTTP con più utenti e compilare la cache.
Microsoft Graph è progettato per gestire un volume elevato di richieste. Se si verifica un numero eccessivo di richieste, Microsoft Graph non riesce la richiesta con codice di stato HTTP 429. Per ulteriori informazioni, vedere limitazione di Microsoft Graph.
Indicizzare il documento con i gruppi autorizzati
Le operazioni di query in Ricerca di intelligenza artificiale di Azure vengono eseguite su un indice di Ricerca di intelligenza artificiale di Azure. In questo passaggio, un'operazione di indicizzazione importa i dati ricercabili in un indice, inclusi gli identificatori usati come filtri di sicurezza.
Ricerca di intelligenza artificiale di Azure non autentica le identità utente o fornisce logica per stabilire il contenuto che un utente ha l'autorizzazione per visualizzare. Il caso d'uso per la limitazione della sicurezza presuppone che si fornisca l'associazione tra un documento sensibile e l'identificatore di gruppo che ha accesso a tale documento, importato in un indice di ricerca.
Nell'esempio ipotetico, il corpo della richiesta PUT in un indice di Ricerca AI di Azure includerà il saggio o la trascrizione di un candidato insieme all'identificatore del gruppo che dispone dell'autorizzazione per visualizzarlo.
Nell'esempio generico usato nell'esempio di codice per questa procedura dettagliata, l'azione sull'indice potrebbe essere simile alla seguente:
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);
Eseguire una richiesta di ricerca
Per motivi di sicurezza, i valori nel campo di sicurezza nell'indice sono valori statici usati per includere o escludere documenti nei risultati della ricerca. Ad esempio, se l'identificatore di gruppo per le ammissione è "A11B22C33D44-E55F66G77-H88I99JKK", tutti i documenti in un indice di Ricerca intelligenza artificiale di Azure con tale identificatore nel campo di sicurezza vengono inclusi (o esclusi) nei risultati della ricerca inviati al chiamante.
Per filtrare i documenti restituiti nei risultati della ricerca in base ai gruppi di utenti che emettono la richiesta, esaminare i passaggi seguenti.
Passaggio 1: Recuperare gli identificatori di gruppo dell'utente
Se i gruppi dell'utente non sono già stati memorizzati nella cache o la cache è scaduta, inviare la richiesta del gruppo .
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);
}
Passaggio 2: Comporre la richiesta di ricerca
Supponendo di avere l'appartenenza ai gruppi dell'utente, è possibile inviare la richiesta di ricerca con i valori di filtro appropriati.
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));
}
Passaggio 3: Gestire i risultati
La risposta include un elenco filtrato di documenti, costituiti da quelli che l'utente ha l'autorizzazione per la visualizzazione. A seconda del modo in cui si costruisce la pagina dei risultati della ricerca, è possibile includere segnali visivi per riflettere il set di risultati filtrato.
Elementi chiave
In questa procedura dettagliata si è appreso un modello per l'uso degli accessi utente per filtrare i documenti nei risultati di Ricerca di intelligenza artificiale di Azure, tagliando i risultati dei documenti che non corrispondono al filtro fornito nella richiesta.