Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Un seul agent hébergé sert de nombreux utilisateurs à partir d’un point de terminaison. Cet article vous montre comment Microsoft Foundry conserve les sessions, conversations et données stockées privées de chaque utilisateur, et comment étendre cette isolation aux utilisateurs de votre propre application. À la fin, vous pouvez appeler un agent et confirmer qu’un appelant ne peut pas voir les sessions, conversations ou données stockées d’un autre appelant.
Prerequisites
- Un agent hébergé déployé. Pour en déployer un, consultez Déployer un agent hébergé.
- Les extensions Azure Developer CLI Foundry, pour les étapes de l’interface CLI. Consultez Installez les extensions Foundry de l’interface de ligne de commande Azure Developer.
- Une session authentifiée. Exécutez
azd auth login, ou connectez-vous avec les informations d’identification Entra de Microsoft qu’utilise votre SDK ou votre client REST. - Le rôle Foundry User sur le projet.
Important
Les rôles Foundry RBAC ont été récemment renommés. Foundry User, Foundry Owner, Propriétaire du compteFoundry et Foundry Project Manager ont été précédemment nommés Azure utilisateur IA, Azure propriétaire d’IA, propriétaire Azure compte IA et Azure gestionnaire Project IA. Il se peut que vous voyiez encore les anciens noms à certains endroits pendant le déploiement de ce changement de nom. Les ID de rôle et les autorisations de base ne sont pas modifiés par ce changement de nom.
Comprendre l’isolation par utilisateur
La plateforme identifie chaque appelant à partir de son jeton Microsoft Entra et garde ses données confidentielles et propres à cette identité, bien que tous les appelants accèdent au même agent via un point de terminaison unique partagé. Pour chaque utilisateur, les éléments suivants restent isolés :
- Conversations. L’historique des conversations de chaque utilisateur ( les messages, les appels d’outils et les réponses qu’ils filent via le protocole Réponses) est privé pour cet utilisateur. Un utilisateur ne peut pas lire ou répertorier les conversations d’un autre utilisateur.
- Sessions Chaque appelant obtient sa propre session par défaut, de sorte que les sessions qu’un utilisateur peut répertorier et gérer n’incluent pas les sessions d’un autre utilisateur.
- Données stockées. Les données que votre agent stocke pour un utilisateur sont limités à cet utilisateur, de sorte qu’il n’est pas retourné à un autre utilisateur.
Considérez-le comme un agent servant de nombreux espaces de travail privés. Chaque session obtient également un système de fichiers privé $HOME dans son propre bac à sable, isolé par défaut, car chaque utilisateur obtient sa propre session. Si vous placez plutôt plusieurs utilisateurs dans une session, ce bac à sable est partagé : consultez Multiplex plusieurs utilisateurs dans une session d’agent hébergée. Pour plus d’informations sur le modèle de session, consultez Agents hébergés dans Foundry Agent Service.
Les scénarios classiques sont les suivants :
- Conversation individuelle par utilisateur. Chaque client connecté obtient son propre historique de conversation, sessions et données stockées.
- Applications multi-locataires. Les utilisateurs de chaque locataire sont isolés des utilisateurs de chaque autre locataire.
Vous obtenez cette isolation par défaut. Les sections suivantes montrent le chemin d’accès par défaut, puis comment l’étendre aux utilisateurs que vous vous authentifiez vous-même.
Appeler un agent avec isolation automatique
Invoquez l’agent en tant qu’identité connectée. La plateforme crée une session associée à cette identité et renvoie son agent_session_id.
azd ai agent invoke "Summarize the latest support tickets"
La session est associée à l’identité de azd auth login. Un autre utilisateur connecté qui exécute la même commande obtient une session privée distincte.
Configurez les variables partagées que les exemples REST utilisent :
BASE_URL="https://my-account.services.ai.azure.com/api/projects/my-project"
API_VERSION="v1"
RESOURCE="https://ai.azure.com"
AGENT_NAME="my-agent"
az rest --method POST \
--url "${BASE_URL}/agents/${AGENT_NAME}/endpoint/protocols/openai/responses?api-version=${API_VERSION}" \
--resource "${RESOURCE}" \
--body '{
"input": "Summarize the latest support tickets",
"stream": false
}'
Le jeton Microsoft Entra sur la demande identifie l’appelant. La charge utile de réponse comprend le agent_session_id que la plateforme a créé et limité à cette identité.
openai_client = project.get_openai_client(agent_name="my-agent")
response = openai_client.responses.create(
input="Summarize the latest support tickets",
)
session_id = response.model_extra.get("agent_session_id")
print(f"Session: {session_id}")
Le client OpenAI s'authentifie avec les informations d'identification Microsoft Entra de l'appelant, de sorte que la session est étendue à cette identité.
const openAIClient = project.getOpenAIClient({
azureConfig: { allowPreview: true, agentName: "my-agent" },
});
const response = await openAIClient.responses.create({
input: "Summarize the latest support tickets",
});
const sessionId = (response as any).agent_session_id;
console.log(`Session: ${sessionId}`);
Le client OpenAI s'authentifie avec les informations d'identification Microsoft Entra de l'appelant, de sorte que la session est étendue à cette identité.
Isoler les sessions pour vos propres utilisateurs
Si votre application authentifie elle-même ses propres utilisateurs finaux, par exemple via Google, GitHub ou un fournisseur d’identité personnalisé, un service de confiance peut indiquer à Foundry à quel utilisateur final appartient une requête, afin que la plateforme isole les sessions par utilisateur final plutôt que par service appelant.
Le service envoie l’identificateur stable de l’utilisateur final dans l’en-tête x-ms-user-identity . La plateforme traite la valeur comme une chaîne de caractères opaque et associe la session à celle-ci. La valeur doit être de 1 à 256 caractères et contenir uniquement des lettres, des chiffres et des caractères . _ : - @; d’autres valeurs sont rejetées.
Pour transmettre x-ms-user-identity, l’identité appelante doit disposer de l’autorisation Microsoft.CognitiveServices/accounts/AIServices/agents/endpoints/UserIdentityImpersonation/action sur l’agent. Cette autorisation n’est incluse dans aucun rôle intégré. Elle était auparavant incluse dans l’action de données Microsoft.CognitiveServices/*, mais cette action n’y donne plus droit. Accordez cette autorisation de manière explicite en créant un rôle personnalisé qui inclut l’autorisation de données, puis en attribuant ce rôle à l’identité de votre service intermédiaire. Un appelant sans cela reçoit un 403. Pour connaître les commandes de définition et d’attribution de rôle personnalisées, consultez Déléguer l’identité de l’utilisateur final.
Si un service contient cette autorisation, mais n’envoie pas l’en-tête sur une demande, la plateforme étend cette session à l’identité du service au lieu d’un utilisateur final. Votre service peut combiner des appels délégués et non délégués, mais seules les requêtes qui incluent x-ms-user-identity sont isolées par utilisateur final.
Warning
Dans le cadre de la délégation, la plateforme n’isole pas un utilisateur final délégué d’un autre. Elle applique une limite stricte uniquement entre les appelants délégués et non délégués. Elle permet à tous vos utilisateurs délégués d’entrer dans une session que votre application a créée. Donnez à chaque utilisateur son propre ID de session ; si vous routez deux utilisateurs vers la même session, ils peuvent voir les données des uns des autres. Pour partager délibérément une même session, consultez Faire utiliser une même session d’agent hébergée à plusieurs utilisateurs.
az rest --method POST \
--url "${BASE_URL}/agents/${AGENT_NAME}/endpoint/protocols/openai/responses?api-version=${API_VERSION}" \
--resource "${RESOURCE}" \
--headers "x-ms-user-identity=<stable-end-user-id>" \
--body '{
"input": "Summarize my open tickets",
"stream": false
}'
Remplacez <stable-end-user-id> par l’identifiant que votre service attribue à l’utilisateur final connecté, par exemple un identifiant utilisateur propre au locataire.
openai_client = project.get_openai_client(agent_name="my-agent")
response = openai_client.responses.create(
input="Summarize my open tickets",
extra_headers={"x-ms-user-identity": "<stable-end-user-id>"},
)
Remplacez <stable-end-user-id> l’identificateur que votre service attribue à l’utilisateur final connecté. La session est étendue à cet utilisateur final plutôt qu’au service appelant.
const openAIClient = project.getOpenAIClient({
azureConfig: { allowPreview: true, agentName: "my-agent" },
});
const response = await openAIClient.responses.create(
{ input: "Summarize my open tickets" },
{ headers: { "x-ms-user-identity": "<stable-end-user-id>" } },
);
console.log(response.output_text);
Remplacez <stable-end-user-id> l’identificateur que votre service attribue à l’utilisateur final connecté. La session est étendue à cet utilisateur final plutôt qu’au service appelant.
Azure Developer CLI invoque l’agent en utilisant votre propre identité connectée ; il ne transmet donc pas d’identité déléguée d’utilisateur final. Utilisez le chemin d’accès REST ou SDK de votre service pour envoyer x-ms-user-identity.
Sécuriser l’identité de l’utilisateur final
Lorsque vous utilisez l’isolation déléguée, votre service constitue la frontière de confiance. Choisissez des identificateurs stables par utilisateur, uniques et difficiles à deviner. Réutilisez la même valeur pour le même utilisateur afin que leurs sessions reprendnt correctement.
Important
Dérivez la x-ms-user-identity valeur d’une identité côté serveur authentifiée , jamais à partir d’une valeur que le navigateur ou le client fournit directement. Sinon, un appelant peut définir l’en-tête sur l’identificateur d’un autre utilisateur et lire les données de cet utilisateur. Tout service disposant de l’autorisation de délégation peut agir pour le compte de n’importe quel utilisateur final. Par conséquent, accordez-le uniquement aux services que vous approuvez.
Vérifier l’isolation
Vérifiez que deux identités disposent de deux sessions distinctes :
- Appelez l’agent en tant qu’identité et notez le retour
agent_session_id. - Appelez l’agent en tant que deuxième identité - un utilisateur connecté différent ou une autre
x-ms-user-identityvaleur - et notez sonagent_session_id. - Vérifiez que les deux identifiants sont différents et que, pour chaque identité, la liste des sessions ne renvoie que les sessions de cette identité.
Pour voir l’isolation de bout en bout, déployez l’exemple d’agent de prise de notes, qui stocke les notes par session sous $HOME: les notes de chaque identité atterrissent dans un fichier de session distinct que seule cette identité peut répertorier ou télécharger via l’API Fichiers de session.
Afficher les sessions de tous les utilisateurs
Par défaut, chaque appelant voit uniquement ses propres sessions. Un administrateur ou une automatisation qui contient le rôle Utilisateur Foundry sur le projet peut répertorier et gérer chaque session sur l’agent, quelle que soit l’identité qui l’a créée. Pour gérer les sessions, consultez Gérer les sessions d’agent hébergées.
Clés d’isolation du protocole de conteneur 1.0.0 (obsolète)
Les agents utilisant la version 1.0.0 du protocole de conteneur utilisent l’ancien modèle de clé d’isolation, dans lequel l’appelant fournit une clé d’isolation pour définir la portée des sessions, au lieu que la plateforme dérive l’identité du jeton Microsoft Entra. Ce modèle - et le protocole 1.0.0 lui-même - est déconseillé. Les agents sur le protocole 1.0.0 continuent de fonctionner jusqu’au 31 juillet 2026 ; par la suite, la plateforme bloque les demandes adressées aux agents qui s’exécutent toujours sur le protocole 1.0.0.
Effectuez une mise à niveau vers le protocole 2.0.0 pour obtenir l’isolation automatique par utilisateur décrite plus haut dans cet article. Le protocole 2.0.0 nécessite le SDK AgentServer qui le prend en charge - azure-ai-agentserver-core 2.0.0b7 ou version ultérieure pour Python, ou Azure.AI.AgentServer.Core 1.0.0-beta.26 ou version ultérieure pour .NET. Les versions antérieures utilisent le protocole 1.0.0 ; les mettre à jour dans le cadre de la mise à niveau.
- Si vous restez sur le protocole 1.0.0 pour l’instant, consultez Passer des clés d’isolation à un agent hébergé pour savoir comment fonctionnent les clés d’isolation.
- Pour effectuer la mise à niveau, consultez Migrer les agents hébergés.
Résoudre les problèmes d’isolation
| Symptôme | Cause la plus probable | Que faire |
|---|---|---|
403 ou session_not_accessible lors de l’accès à une session |
La session appartient à une identité différente. | Utilisez la même identité que celle qui a créé la session ou maintenez le rôle Utilisateur Foundry pour afficher les sessions d’autres identités. |
403 dans une requête qui définit x-ms-user-identity |
L’appelant ne dispose pas de l’autorisation UserIdentityImpersonation , qui n’est plus accordée par les rôles intégrés. |
Créez un rôle personnalisé qui inclut l’Microsoft.CognitiveServices/accounts/AIServices/agents/endpoints/UserIdentityImpersonation/action action de données et affectez-le au service appelant. |
| Les exécutions locales n’isolent pas les sessions | Les exécutions locales n’appliquent pas l’isolation. | Testez l’isolation sur un agent déployé. Le mode local (--local, azd ai agent run) cible un seul utilisateur. |
Contenu connexe
- Gérez les sessions d’agent hébergées pour répertorier, inspecter et supprimer des sessions, notamment entre les utilisateurs.
- Multiplexer plusieurs utilisateurs dans une session d’agent hébergée lorsque plusieurs utilisateurs partagent intentionnellement une session.
- Concepts d’identité de l’agent dans Microsoft Foundry pour comprendre comment fonctionnent les identités des agents et des utilisateurs.
- Appelez un agent hébergé avec l’interface CLI Azure Développeur pour chaque variante et option d’appel.
- Exemple d’agent de prise de notes pour un agent exécutable qui stocke les données appartenant à l’utilisateur par session (Python et C#).