Autenticación y autorización de App Service en Azure OpenAI mediante Microsoft Entra y el SDK de Semantic Kernel
En este artículo se muestra cómo usar las identidades administradas de Microsoft Entra para autenticar y autorizar una aplicación de App Service a un recurso de Azure OpenAI.
En este artículo también se muestra cómo usar el SDK de Semantic Kernel para implementar fácilmente la autenticación de Microsoft Entra en la aplicación .NET.
Mediante el uso de una identidad administrada de Microsoft Entra, la aplicación de App Service puede acceder fácilmente a los recursos protegidos de Azure OpenAI sin tener que aprovisionar ni girar manualmente ningún secreto.
Requisitos previos
- Una cuenta de Azure que tenga una suscripción activa. Cree una cuenta gratuita.
- .NET SDK
- Paquete NuGet de
Microsoft.SemanticKernel
- Paquete NuGet de
Azure.Identity
- Creación e implementación de un recurso de Azure OpenAI Service
- Creación e implementación de una aplicación .NET en App Service
Adición de una identidad administrada a App Service
La aplicación puede tener dos tipos de identidades:
- Una identidad asignada por el sistema está asociada a la aplicación y se elimina si se elimina la aplicación. Una aplicación solo puede tener una identidad asignada por el sistema.
- Una identidad asignada por el usuario es un recurso de Azure independiente que puede asignarse a la aplicación. Una aplicación puede tener varias identidades asignadas por el usuario.
Adición de una identidad asignada por el sistema
- Vaya a la página de la aplicación en Azure Portal y desplácese hacia abajo hasta el grupo Configuración.
- Seleccione Identidad.
- En la pestaña Asignado por el sistema, cambie Estado a Activado y, a continuación, seleccione Guardar.
Ejecute el comando az webapp identity assign
para crear una identidad asignada por el sistema:
az webapp identity assign --name <appName> --resource-group <groupName>
Adición de una identidad asignada por el usuario
Para agregar una identidad asignada por el usuario a la aplicación, cree la identidad y, después, agregue su identificador de recurso a la configuración de la aplicación.
Cree un recurso de identidad administrada asignada por el usuario siguiendo estas instrucciones.
En el panel de navegación izquierdo de la página de la aplicación, desplácese hacia abajo hasta el grupo Configuración.
Seleccione Identidad.
Seleccione Asignado por el usuario>Agregar.
Busque la identidad que creó anteriormente, selecciónela y, a continuación, elija Agregar.
Importante
Después de seleccionar Agregar, la aplicación se reinicia.
Cree una identidad asignada por el usuario:
az identity create --resource-group <groupName> --name <identityName>
Asigne la identidad a la aplicación:
az webapp identity assign --resource-group <groupName> --name <appName> --identities <identityId>
Adición de un rol de usuario de Azure OpenAI a la identidad administrada
- En Azure Portal, vaya al ámbito al que desea conceder acceso de Azure OpenAI. El ámbito puede ser un grupo de administración, una suscripción, un grupo de recursos o un recurso específico de Azure OpenAI.
- En el panel de navegación de la izquierda, seleccione Control de acceso (IAM).
- Seleccione Agregar y, luego, Agregar asignación de roles.
- En la pestaña Rol, seleccione el rol de usuario de OpenAI de Cognitive Services.
- En la pestaña Miembros, seleccione la identidad administrada.
- En la pestaña Revisión y asignación, seleccione Revisión y asignación para asignar el rol.
Ámbito del recurso
az role assignment create --assignee "<managedIdentityObjectID>" \
--role "Cognitive Services OpenAI User" \
--scope "/subscriptions/<subscriptionId>/resourcegroups/<resourceGroupName>/providers/<providerName>/<resourceType>/<resourceSubType>/<resourceName>"
Ámbito del grupo de recursos
az role assignment create --assignee "<managedIdentityObjectID>" \
--role "Cognitive Services OpenAI User" \
--scope "/subscriptions/<subscriptionId>/resourcegroups/<resourceGroupName>"
Ámbito de la suscripción
az role assignment create --assignee "<managedIdentityObjectID>" \
--role "Cognitive Services OpenAI User" \
--scope "/subscriptions/<subscriptionId>"
Ámbito del grupo de administración
az role assignment create --assignee "<managedIdentityObjectID>" \
--role "Cognitive Services OpenAI User" \
--scope "/providers/Microsoft.Management/managementGroups/<managementGroupName>"
Implementación de la autenticación basada en tokens mediante el SDK de Semantic Kernel
Inicialice un objeto
DefaultAzureCredential
para asumir la identidad administrada de la aplicación:// Initialize a DefaultAzureCredential. // This credential type will try several authentication flows in order until one is available. // Will pickup Visual Studio or Azure CLI credentials in local environments. // Will pickup managed identity credentials in production deployments. TokenCredential credentials = new DefaultAzureCredential( new DefaultAzureCredentialOptions { // If using a user-assigned identity specify either: // ManagedIdentityClientId or ManagedIdentityResourceId. // e.g.: ManagedIdentityClientId = "myIdentityClientId". } );
Cree un objeto
Kernel
que incluya el servicio de finalización de chat de Azure OpenAI y use las credenciales creadas anteriormente:// Retrieve the endpoint and deployment obtained from the Azure OpenAI deployment. // Must use the deployment name not the underlying model name. IConfigurationRoot config = new ConfigurationBuilder().AddUserSecrets<Program>().Build(); string endpoint = config["AZURE_OPENAI_ENDPOINT"]!; string deployment = config["AZURE_OPENAI_GPT_NAME"]!; // Build a Kernel that includes the Azure OpenAI Chat Completion Service. // Include the previously created token credential. Kernel kernel = Kernel .CreateBuilder() .AddAzureOpenAIChatCompletion(deployment, endpoint, credentials) .Build();
Use el objeto
Kernel
para invocar la finalización de la solicitud mediante Azure OpenAI:// Use the Kernel to invoke prompt completion through Azure OpenAI. // The Kernel response will be null if the model can't be reached. string? result = await kernel.InvokePromptAsync<string>("Please list three Azure services"); Console.WriteLine($"Output: {result}"); // Continue sending and receiving messages between the user and AI. // ...