Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Un único agente hospedado sirve a muchos usuarios desde un punto de conexión. En este artículo se muestra cómo Microsoft Foundry mantiene privadas las sesiones, conversaciones y datos almacenados de cada usuario y cómo ampliar ese aislamiento a los usuarios de su propia aplicación. Al final, podrá invocar un agente y confirmar que un usuario que llama no puede ver las sesiones, las conversaciones ni los datos almacenados de otro usuario.
Prerrequisitos
- Un agente hospedado implementado. Para implementar uno, consulte Implementación de un agente hospedado.
- Las extensiones de Azure Developer CLI Foundry para los pasos de la CLI. Consulte Instalar las extensiones de Foundry para Azure Developer CLI.
- Una sesión autenticada. Ejecute
azd auth login, o inicie sesión con la credencial de Microsoft Entra que utiliza su SDK o cliente REST. - El rol de usuario de Foundry en el proyecto.
Importante
Recientemente se cambió el nombre de los roles RBAC de Foundry. Foundry User, Foundry Owner, Foundry Account Owner y Foundry Project Manager se llamaban anteriormente Usuario de Azure AI, Propietario de Azure AI, Propietario de la cuenta de Azure AI y Administrador de proyectos de Azure AI. Es posible que siga viendo los nombres anteriores en algunos lugares mientras se implementa el cambio de nombre. El cambio de nombre no modifica los identificadores de rol y los permisos principales.
Comprender el aislamiento por usuario
La plataforma identifica a cada usuario por su token de Microsoft Entra y mantiene sus datos privados y asociados únicamente a esa identidad, aunque todos accedan al mismo agente a través de un único punto de conexión compartido. Para cada usuario, los siguientes permanecen aislados:
- Conversaciones. El historial de conversación de cada usuario —los mensajes, las invocaciones de herramientas y las respuestas que encadenan a través del protocolo Responses— es privado para ese usuario. Un usuario no puede leer ni enumerar las conversaciones de otro usuario.
- Son sesiones. Cada llamador obtiene su propia sesión de forma predeterminada, por lo que las sesiones que un usuario puede enumerar y administrar no incluyen las sesiones de otro usuario.
- Datos almacenados. Los datos que almacena el agente para un usuario se limitan a ese usuario, por lo que no se devuelven a otro usuario.
Piense en él como un agente que atiende muchas áreas de trabajo privadas. Cada sesión también dispone de un sistema de archivos privado $HOME en su propio entorno aislado, que está aislado de forma predeterminada porque cada usuario tiene su propia sesión. Si en su lugar sitúa a varios usuarios en una sola sesión, ese entorno aislado se comparte; consulte Multiplexar varios usuarios en una sesión de agente hospedada. Para obtener más información sobre el modelo de sesión, consulte Agentes hospedados en Foundry Agent Service.
Entre los escenarios típicos se incluyen:
- Chat por usuario. Cada cliente que ha iniciado sesión obtiene su propio historial de conversaciones, sesiones y datos almacenados.
- Aplicaciones multiinquilino. Los usuarios de cada inquilino están aislados de los usuarios de cada otro inquilino.
Este aislamiento se obtiene de forma predeterminada. En las secciones siguientes se muestra la ruta de acceso predeterminada y, a continuación, cómo ampliarla a los usuarios que se autentican usted mismo.
Invocar un agente con aislamiento automático
Invoque al agente como la identidad con sesión iniciada. La plataforma crea una sesión asociada a esa identidad y devuelve su agent_session_id.
azd ai agent invoke "Summarize the latest support tickets"
La sesión pertenece a la identidad de azd auth login. Otro usuario que ha iniciado sesión que ejecuta el mismo comando obtiene una sesión privada independiente.
Configure las variables compartidas que usan los ejemplos de REST:
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
}'
El token de Microsoft Entra en la solicitud identifica al autor de la llamada. La carga útil de la respuesta incluye agent_session_id, que la plataforma creó y asoció a esa identidad.
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}")
El cliente de OpenAI se autentica con la credencial de Microsoft Entra de quien realiza la llamada, por lo que la sesión queda limitada a esa identidad.
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}`);
El cliente de OpenAI se autentica con la credencial de Microsoft Entra de quien realiza la llamada, por lo que la sesión queda limitada a esa identidad.
Aislar las sesiones de sus propios usuarios
Si la aplicación autentica a sus propios usuarios finales (por ejemplo, a través de Google, GitHub o un proveedor de identidades personalizado), un servicio de confianza puede indicar a Foundry a qué usuario final pertenece una solicitud, por lo que la plataforma aísla las sesiones por usuario final en lugar de por servicio de llamada.
El servicio envía el identificador estable del usuario final en el x-ms-user-identity encabezado . La plataforma trata el valor como una cadena opaca y limita la sesión a ella. El valor debe tener entre 1 y 256 caracteres y contener solo letras, dígitos y los caracteres . _ : - @; se rechazan otros valores.
Para aprobar x-ms-user-identity, la identidad que realiza la llamada debe tener el permiso Microsoft.CognitiveServices/accounts/AIServices/agents/endpoints/UserIdentityImpersonation/action sobre el agente. Este permiso no se incluye en ningún rol integrado. Anteriormente lo incluía la acción de datos Microsoft.CognitiveServices/*, pero esa acción ya no lo concede. Concédalo explícitamente mediante la creación de un rol personalizado que incluya la acción de datos y la asignación de ese rol a la identidad del servicio de nivel intermedio. Quien llama, si no lo tiene, recibe un 403. Para ver los comandos de asignación y definición de roles personalizados, consulte Delegación de la identidad del usuario final.
Si un servicio contiene este permiso, pero no envía el encabezado a una solicitud, la plataforma limita esa sesión a la propia identidad del servicio en lugar de a un usuario final. El servicio puede mezclar llamadas delegadas y no delegadas, pero solo las solicitudes que incluyen x-ms-user-identity están aisladas por usuario final.
Advertencia
En la delegación, la plataforma no aísla a un usuario final delegado de otro. Impone una separación estricta solo entre los usuarios delegados y no delegados; permite que cualquiera de sus usuarios delegados entre en una sesión que haya creado su aplicación. Asigne a cada usuario su propio identificador de sesión; si enruta dos usuarios a la misma sesión, pueden ver los datos de los demás. Para compartir de forma intencionada una sesión, consulte Multiplexar varios usuarios en una sesión de agente alojado.
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
}'
Sustituya <stable-end-user-id> por el identificador que su servicio asigna al usuario final que ha iniciado sesión, como un ID de usuario limitado al inquilino.
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>"},
)
Reemplace por <stable-end-user-id> el identificador que el servicio asigna al usuario final que ha iniciado sesión. La sesión se limita a ese usuario final en lugar de al servicio de llamada.
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);
Reemplace por <stable-end-user-id> el identificador que el servicio asigna al usuario final que ha iniciado sesión. La sesión se limita a ese usuario final en lugar de al servicio de llamada.
La CLI para desarrolladores de Azure invoca al agente con la identidad con la que ha iniciado sesión, por lo que no transmite una identidad delegada de usuario final. Use la ruta de acceso REST o SDK de su servicio para enviar x-ms-user-identity.
Protección de la identidad del usuario final
Cuando usas el aislamiento delegado, tu servicio es el límite de confianza. Elija identificadores estables por usuario, únicos y difíciles de adivinar. Vuelva a usar el mismo valor para el mismo usuario para que sus sesiones se reanuden correctamente.
Importante
Derivar el x-ms-user-identity valor de una identidad autenticada del lado servidor: nunca de un valor que el explorador o el cliente proporciona directamente. De lo contrario, quien realiza la llamada puede establecer la cabecera con el identificador de otro usuario y leer los datos de ese usuario. Cualquier servicio con el permiso de delegación puede actuar en nombre de cualquier usuario final, por lo que concédalo solo a los servicios que confíe.
Comprobación del aislamiento
Confirme que dos identidades generan dos sesiones distintas:
- Invoque al agente con una identidad y anote el valor devuelto
agent_session_id. - Invoque al agente como una segunda identidad: la de otro usuario que haya iniciado sesión, o con un valor de
x-ms-user-identitydiferente, y anote suagent_session_id. - Confirme que los dos ID difieren y que, al listar las sesiones como cada identidad, solo se devuelven las sesiones de esa identidad.
Para ver el aislamiento de un extremo a otro, implemente el ejemplo del agente de toma de notas, que almacena notas por sesión en $HOME: las notas de cada identidad llegan a un archivo de sesión independiente que solo esa identidad puede enumerar o descargar a través de la API de archivos de sesión.
Visualización de sesiones entre usuarios
De forma predeterminada, cada llamador solo ve sus propias sesiones. Un administrador o automatización que contiene el rol Usuario de Foundry en el proyecto puede enumerar y administrar todas las sesiones del agente, independientemente de la identidad que la creó. Para administrar sesiones, consulte Administración de sesiones del agente hospedado.
Claves de aislamiento en el protocolo de contenedor 1.0.0 (en desuso)
Los agentes que usan la versión 1.0.0 del protocolo de contenedor utilizan el modelo anterior de clave de aislamiento, en el que la entidad que realiza la llamada proporciona una clave de aislamiento para delimitar el ámbito de las sesiones, en lugar de que la plataforma derive la identidad a partir del token de Microsoft Entra. Este modelo ( y el protocolo 1.0.0 en sí) están en desuso. Los agentes del protocolo 1.0.0 continúan funcionando hasta el 31 de julio de 2026; después, la plataforma bloquea las solicitudes a los agentes que todavía se ejecutan en el protocolo 1.0.0.
Actualice al protocolo 2.0.0 para obtener el aislamiento automático por usuario descrito anteriormente en este artículo. Protocol 2.0.0 requiere el SDK de AgentServer que lo admita: azure-ai-agentserver-core 2.0.0b7 o posterior para Python, o Azure.AI.AgentServer.Core 1.0.0-beta.26 o posterior para .NET. Las versiones anteriores usan el protocolo 1.0.0; actualícelos como parte de la actualización.
- Si permanece en el protocolo 1.0.0 por ahora, consulte Pasar claves de aislamiento a un agente hospedado para saber cómo funcionan las claves de aislamiento.
- Para actualizar, consulte Migración de agentes hospedados.
Solucionar problemas de aislamiento
| Síntoma | Causa probable | Qué probar |
|---|---|---|
403 o session_not_accessible al acceder a una sesión |
La sesión pertenece a una identidad diferente. | Use la misma identidad que creó la sesión o mantenga el rol De usuario de Foundry para ver las sesiones de otras identidades. |
403 en una solicitud que establece x-ms-user-identity |
La entidad que realiza la llamada no tiene el permiso UserIdentityImpersonation, que los roles predefinidos ya no conceden. |
Cree un rol personalizado que incluya la Microsoft.CognitiveServices/accounts/AIServices/agents/endpoints/UserIdentityImpersonation/action acción de datos y asígnelo al servicio de llamada. |
| Las ejecuciones locales no aíslan las sesiones | Las ejecuciones locales no garantizan el aislamiento. | Pruebe el aislamiento frente a un agente desplegado. El modo local (--local, azd ai agent run) tiene como destino un solo usuario. |
Contenido relacionado
- Administre las sesiones del agente hospedado para enumerar, inspeccionar y eliminar sesiones, incluidas entre los usuarios.
- Multiplexar varios usuarios en una misma sesión de agente hospedado cuando varios usuarios comparten intencionadamente la misma sesión.
- Conceptos de identidad del agente en Microsoft Foundry para comprender cómo funcionan las identidades de agente y usuario.
- Invoque un agente hospedado con la CLI de Azure Developer para cada variante y opción de invocación.
- Ejemplo de agente de toma de notas para un agente ejecutable que almacena datos propiedad del usuario por sesión (Python y C#).