Configuración de la autenticación en el agente

Con los recursos de Azure Bot Service aprovisionados, puede configurar el agente para autenticarse con Azure Bot Service. El SDK de agentes de Microsoft 365 proporciona opciones flexibles para la configuración de autenticación, lo que le permite elegir el método que mejor se adapte a las necesidades y los requisitos de seguridad de la aplicación.

El paquete Biblioteca de autenticación de Microsoft del SDK de .NET Agents (MSAL) proporciona herramientas que le ayudan a crear tokens de acceso para clientes de agentes y servicios externos desde un agente autohospedado SDK de agentes de Microsoft 365.

El paquete Microsoft.Agents.Athentication.Msal proporciona la clase MsalAuth, que es el proveedor de autenticación principal. Puede configurarlo para los siguientes tipos de credenciales:

  • Inquilino único con secreto de cliente y multiinquilino con secreto de cliente
  • Certificado de cliente mediante huella digital
  • Certificado de cliente que utiliza el nombre del sujeto (incluido SN+I)
  • Identidad Administrada Asignada por el Usuario
  • Identidad administrada asignada por el sistema
  • Credenciales federadas
  • Identidad de la carga de trabajo

Instalación del paquete de autenticación

Instale el paquete de autenticación de MSAL desde NuGet:

dotnet add package Microsoft.Agents.Authentication.Msal

Inquilino único frente a multiinquilino

La autenticación de secretos de cliente admite configuraciones de inquilino único y multiinquilino.

Nota:

Para una configuración multiinquilino, debe configurar la instancia de Azure Bot como multiinquilino y el registro de aplicaciones de Microsoft Entra ID como Cuentas en cualquier directorio organizativo (cualquier inquilino de Microsoft Entra ID: multiinquilino). Para más información, consulte Aplicaciones de un solo inquilino y de varios inquilinos.

Configuración de una conexión

El paquete de autenticación MSAL permite crear y usar varios clientes distintos con el motor de hospedaje de Agents Framework. Con el paquete de autenticación MSAL, puede proporcionar varias configuraciones de conexión en el archivo de configuración de la aplicación. Cada configuración de conexión se puede usar para crear un cliente de autenticación con nombre para admitir comunicaciones con servicios externos u otros agentes.

Variables de entorno para cada tipo de autenticación

El agente obtiene la configuración de MSAL en tiempo de ejecución de las variables de entorno.

En las secciones siguientes se describen las opciones de configuración necesarias y opcionales para cada uno de los tipos de autenticación admitidos para la autenticación MSAL, junto con fragmentos de código de configuración de ejemplo para cada tipo.

Inquilino único con secreto de cliente

Use estas opciones para configurar una conexión de inquilino único que se autentique con un secreto de cliente.

Nombre de configuración Tipo Valor predeterminado Descripción
ClientId String Null ClientId (AppId) que se usará al crear el token de acceso.
ClientSecret string Null Cuando AuthType es ClientSecret, Is Secret asociado al cliente, solo se debe usar con fines de prueba y desarrollo.
AuthorityEndpoint String Null Cuando está presente, se usa como autoridad para solicitar un token.
TenantId String Null Cuando present y AuthorityEndpoint son NULL, se usa para crear una entidad para solicitar un token
Ámbitos Lista de cadenas Null Listas predeterminadas de ámbitos para los que solicitar tokens. Solo se usa cuando no se pasan ámbitos desde la solicitud de conexión del agente

Este es un ejemplo de appsettings para un solo inquilino ClientSecret:

  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "ClientSecret",
        "ClientId": "{{BOT_ID}}",
        "ClientSecret": "{{BOT_SECRET}}",
        "AuthorityEndpoint": "https://login.microsoftonline.com/{{BOT_TENANT_ID}}",
        "Scopes": [
            "https://api.botframework.com/.default"
          ],
      }
    }
  }

Multiinquilino con secreto de cliente

Use estas opciones para configurar una conexión multiinquilino que se autentique con un secreto de cliente.

Nombre de configuración Tipo Valor predeterminado Descripción
ClientId String Null ClientId (AppId) que se usará al crear el token de acceso.
ClientSecret string Null Cuando AuthType es ClientSecret, Is Secret asociado al cliente, solo se debe usar con fines de prueba y desarrollo.
AuthorityEndpoint String Null Cuando está presente, se usa como autoridad para solicitar un token.
TenantId String Null Cuando present y AuthorityEndpoint son NULL, se usa para crear una entidad para solicitar un token
Ámbitos Lista de cadenas Null Listas predeterminadas de ámbitos para los que solicitar tokens. Solo se usa cuando no se pasan ámbitos desde la solicitud de conexión del agente

Aquí tienes un ejemplo de appsettings para un entorno multiinquilino con secreto de cliente:

  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "ClientSecret",
        "ClientId": "{{BOT_ID}}",
        "ClientSecret": "{{BOT_SECRET}}",
        "AuthorityEndpoint": "https://login.microsoftonline.com/botframework.com",
        "Scopes": [
            "https://api.botframework.com/.default"
          ],
      }
    }
  }

Identidad Administrada Asignada por el Usuario

Use estas opciones para configurar la adquisición de tokens con una identidad administrada asignada por el usuario.

Nombre de configuración Tipo Valor predeterminado Descripción
ClientId String Null Managed Identity ClientId que se usará al crear el token de acceso.

Nota:

Cuando quiera usar los tipos de identidades administradas en su agente, debe ejecutar su host o cliente en un servicio de Azure y configurar ese servicio con una identidad administrada asignada por el sistema o una identidad administrada asignada por el usuario.

Este es un ejemplo de appsettings para una identidad administrada asignada por el usuario:

  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "UserManagedIdentity",
        "ClientId": "{{BOT_ID}}",
        "Scopes": [
          "https://api.botframework.com/.default"
        ]
      }
    }
  }

Identidad administrada asignada por el sistema

Cuando se usa SystemManagedIdentity, el agente omite cualquier identificador de cliente proporcionado y usa la identidad administrada por el sistema.

Nota:

Si quiere usar los tipos de identidad administrada en el agente, debe ejecutar el host o el cliente en un servicio de Azure y configurar ese servicio con una identidad administrada asignada por el sistema o una identidad administrada asignada por el usuario.

Este es un ejemplo de appsettings para el tipo de autenticación de identidad administrada System-Assigned:

  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "SystemManagedIdentity",
        "Scopes": [
          "https://api.botframework.com/.default"
        ]
      }
    }
  }

Credenciales federadas

Use estas opciones para configurar una conexión que intercambia credenciales federadas para tokens de acceso.

Nombre de configuración Tipo Valor predeterminado Descripción
ClientId String Null ClientId (AppId) que se usará al crear el token de acceso.
AuthorityEndpoint String Null Cuando está presente, se usa como autoridad para solicitar un token.
TenantId String Null Cuando present y AuthorityEndpoint son NULL, se usa para crear una entidad para solicitar un token
Ámbitos Lista de cadenas Null Listas predeterminadas de ámbitos para los que solicitar tokens. Solo se usa cuando no se pasan ámbitos desde la solicitud de conexión del agente
FederatedClientId String Null Managed Identity ClientId que se usará al crear el token de acceso.

Este es un ejemplo de appsettings para Federated Credentials:

  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "FederatedCredentials",
        "ClientId": "{{BOT_ID}}",
        "AuthorityEndpoint": "https://login.microsoftonline.com/{{BOT_TENANT_ID}}",
        "FederatedClientId": "{{BOT_FEDERATED_ID}}",
        "Scopes": [
          "https://api.botframework.com/.default"
        ]
      }
    }
  }

Identidad de la carga de trabajo

Use estas opciones para configurar la autenticación de identidad de carga de trabajo mediante un archivo de token federado.

Nombre de configuración Tipo Valor predeterminado Descripción
ClientId String Null ClientId (AppId) que se usará al crear el token de acceso.
AuthorityEndpoint String Null Cuando está presente, se usa como autoridad para solicitar un token.
TenantId String Null Cuando present y AuthorityEndpoint son NULL, se usa para crear una entidad para solicitar un token
Ámbitos Lista de cadenas Null Listas predeterminadas de ámbitos para los que solicitar tokens. Solo se usa cuando no se pasan ámbitos desde la solicitud de conexión del agente
FederatedTokenFile String Null El archivo de token (igual que AKS AZURE_FEDERATED_TOKEN_FILE env var)

Aquí tienes un ejemplo de appsettings para un único inquilino WorkloadIdentity:

  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "WorkloadIdentity",
        "ClientId": "{{BOT_ID}}",
        "AuthorityEndpoint": "https://login.microsoftonline.com/{{BOT_TENANT_ID}}",
        "FederatedTokenFile": "{{BOT_FEDERATED_TOKENFILE}}",
        "Scopes": [
          "https://api.botframework.com/.default"
        ]
      }
    }
  }

Credenciales federadas opcionales u opciones de declaración del cliente para la identidad de la carga de trabajo

Use esta configuración opcional para personalizar el contenido de aserción de cliente para las credenciales federadas o los flujos de identidad de carga de trabajo.

Nombre de configuración Tipo Valor predeterminado Descripción
ClientId String Null Identificador de cliente para el que se solicita una aserción firmada
TokenEndpoint String Null Punto de conexión del token previsto
Reclamaciones String Null Notificaciones que se incluirán en la aserción de cliente
ClientCapabilities Cadena[] Null Funcionalidades que declara la aplicación cliente.
  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "WorkloadIdentity",
        "ClientId": "{{BOT_ID}}",
        "AuthorityEndpoint": "https://login.microsoftonline.com/{{BOT_TENANT_ID}}",
        "FederatedTokenFile": "{{BOT_FEDERATED_TOKENFILE}}",
        "Scopes": [
          "https://api.botframework.com/.default"
        ],
        "AssertionRequestOptions": {
            "ClientId": null,
            "TokenEndpoint": null,
            "Claims": null,
            "ClientCapabilities": null,
        }
      }
    }
  }

Certificado que utiliza el nombre del sujeto (incluidos SN+I)

Use estas opciones para configurar la autenticación basada en certificados por nombre del firmante del certificado, incluidos los escenarios de SN+I.

TipoDeAutenticación Tipo Valor predeterminado Descripción
AuthorityEndpoint String Null Cuando está presente, se usa como autoridad para solicitar un token.
TenantId String Null Cuando present y AuthorityEndpoint son NULL, se usa para crear una entidad para solicitar un token
Ámbitos Lista de cadenas Null Listas predeterminadas de ámbitos para los que solicitar tokens. Solo se usa cuando no se pasan ámbitos desde la solicitud de conexión del agente
ClientId String Null ClientId (AppId) que se usará al crear el token de acceso.
CertSubjectName String Null Cuando AuthType es CertificateSubjectName, este es el nombre del firmante que se busca
CertStoreName String "Mi" Cuando AuthType es CertificateSubjectName o Certificate, indica en qué almacén de certificados se va a buscar
ValidCertificateOnly bool Cierto Requiere que el certificado tenga una cadena válida.
SendX5C bool Falso Habilita la rotación automática de certificados con la configuración adecuada.

Este es un ejemplo de appsettings para un certificado que usa el nombre del sujeto para Subject Name and Issuer (SNI) y para varios inquilinos:

  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "CertificateSubjectName",
        "ClientId": "{{BOT_ID}}",
        "CertSubjectName": "{{BOT_CERT_SUBJECTNAME}}",
        "SendX5C": true,
        "AuthorityEndpoint": "https://login.microsoftonline.com/botframework.com",
        "Scopes": [
          "https://api.botframework.com/.default"
        ]
      }
    }
  },

Aquí tienes un ejemplo de appsettings para el nombre del sujeto del certificado para SN+I y un solo inquilino:

  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "CertificateSubjectName",
        "ClientId": "{{BOT_ID}}",
        "CertSubjectName": "{{BOT_CERT_SUBJECTNAME}}",
        "SendX5C": true,
        "AuthorityEndpoint": "https://login.microsoftonline.com/{{BOT_TENANT_ID}}",
        "Scopes": [
          "https://api.botframework.com/.default"
        ]
      }
    }
  },

Certificado de cliente mediante huella digital

Use estas opciones para configurar la autenticación basada en certificados mediante la huella digital del certificado.

TipoDeAutenticación Tipo Valor predeterminado Descripción
AuthorityEndpoint String Null Cuando está presente, se usa como autoridad para solicitar un token.
TenantId String Null Cuando present y AuthorityEndpoint son NULL, se usa para crear una entidad para solicitar un token
Ámbitos Lista de cadenas Null Listas predeterminadas de ámbitos para los que solicitar tokens. Solo se usa cuando no se pasan ámbitos desde la solicitud de conexión del agente
ClientId String Null ClientId (AppId) que se usará al crear el token de acceso.
CertThumbprint String Null Huella digital del certificado que se va a cargar, solo válida cuando AuthType se establece como certificado
CertStoreName String "Mi" Cuando AuthType es CertificateSubjectName o Certificate, indica en qué almacén de certificados se va a buscar
ValidCertificateOnly bool Cierto Requiere que el certificado tenga una cadena válida.
SendX5C bool Falso Habilita la rotación automática de certificados con la configuración adecuada.

Este es un ejemplo de appsettings para el certificado mediante la huella digital del certificado:

  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "Certificate",
        "ClientId": "{{BOT_ID}}",
        "CertThumbprint": "{{BOT_CERT_THUMBPRINT}}",
        "AuthorityEndpoint": "https://login.microsoftonline.com/botframework.com",
        "Scopes": [
          "https://api.botframework.com/.default"
        ]
      }
    }
  },

Proveedor de configuración predeterminado para MSAL

Para facilitar la configuración, proporcionamos una extensión del proveedor de servicios para agregar las opciones de configuración predeterminadas de MSAL al agente.

Aquí tiene un ejemplo del proveedor predeterminado de configuración de MSAL para un host de ASP.NET Core en una clase Program.cs.

Esto se administra mediante la instancia registrada IConnections. La IConnections instancia se agrega de forma predeterminada cuando se usa AddAgent.

// Register your AgentApplication
builder.AddAgent<MyAgent>();

Sin embargo, si no usa AddAgent, debe registrar explícitamente la IConnections instancia.

    // Add Connections object to access configured token connections.
    builder.Services.AddSingleton<IConnections, ConfigurationConnections>();

Más opciones de configuración de MSAL

Hay varias opciones de configuración compartidas que controlan la configuración general para adquirir tokens de Microsoft Entra Identity.

Estos valores son:

Use la siguiente configuración compartida para controlar el tiempo de espera de la solicitud MSAL, el comportamiento de reintento y los detalles de registro.

Nombre de configuración Tipo Valor predeterminado Descripción
MSALRequestTimeout TimeSpan 30segundos Esta configuración controla cuánto tiempo esperará el cliente para una respuesta de Microsoft Entra ID después de enviar una solicitud.
MSALRetryCount Int 3 Esta configuración controla el número de reintentos que realiza el proveedor para una solicitud individual de un token.
MSALEnabledLogPII Bool Falso Esta configuración controla si MSAL proporciona el registrador adjunto con datos personales.

Esta configuración se comparte con todos los clientes que crean mediante el proveedor de autenticación msal. Esta configuración está pensada para leerse mediante un lector IConfiguration, desde una sección de configuración denominada "MSALConfiguration".

Nota:

MSALConfiguration es una configuración opcional. Si no establece esta configuración, se usan las configuraciones predeterminadas para estos valores.

Este es un ejemplo de la entrada en un appsettings.json archivo:

{
  "MSALConfiguration": {
    "MSALEnabledLogPII": "true",
    "MSALRequestTimeout": "00:00:40",
    "MSALRetryCount": "1"
  },
}

En este caso, este bloque de configuración indicaría a todos los clientes MSAL creados con el proveedor de MSAL que habilitaran el registro de datos personales, establecerían el tiempo de espera en 40 segundos y reducirían el número de reintentos a 1.

Esta extensión busca una sección de configuración denominada "MSALConfiguration" en el IConfiguration objeto y crea un objeto de configuración de MSAL a partir de él.

Si no se encuentra la sección MSALConfig, crea el objeto de configuración de MSAL con valores predeterminados.

    // Add default agent MsalAuth support
    builder.Services.AddDefaultMsalAuth(builder.Configuration);

    // Register your AgentApplication
    builder.AddAgent<MyAgent>();

Soporte de registro para autenticación

El sistema de autenticación MSAL permite el registro independiente de flujos de autenticación para la integración de telemetría si necesita solucionar problemas de adquisición de tokens.

Para habilitar el registro, añada una entrada para Microsoft.Agents.Authentication.Msal a la configuración de la aplicación para configurar un ILogger que informe sobre las operaciones con tokens de sus conexiones. Si agrega la MSALEnabledLogPII opción , esto también incluye datos personales para la conexión.

Este es un ejemplo del bloque de registro en este caso:

  "Logging": {
    "LogLevel": {
      "Default": "Warning",
      "Microsoft.Agents": "Warning",
      "Microsoft.Hosting.Lifetime": "Information",
      "Microsoft.Agents.Authentication.Msal": "Trace"
    }
  }

En este caso, el registro está habilitado para varios módulos, como Microsoft.Agents.Authentication.Msal, donde el nivel de seguimiento es "Seguimiento" para MSAL.

El SDK de JavaScript requiere authenticationProvider para obtener tokens web JSON (JWT) para enviar actividades al canal de destino. Para obtener más información, consulte Tokens de acceso de la plataforma de identidad de Microsoft.

El paquete @microsoft/agents-hosting proporciona un proveedor de autenticación predeterminado basado en Biblioteca de autenticación de Microsoft (MSAL). Puede configurarlo para los siguientes tipos de autenticación:

  • Inquilino único con secreto de cliente
  • Multiinquilino con secreto de cliente
  • Identidad administrada por el usuario
  • identidad administrada por el sistema
  • Credenciales federadas
  • Identidad de la carga de trabajo
  • Certificado

Instalación del paquete de autenticación

Instale el paquete de autenticación de MSAL desde npm:

npm install @microsoft/agents-hosting

Inquilino único frente a multiinquilino

El secreto de cliente y la autenticación de certificados de cliente admiten configuraciones de inquilino único y multiinquilino.

La identidad administrada asignada por el usuario, la identidad administrada del sistema, las credenciales federadas y la identidad de carga de trabajo solo admiten configuraciones de inquilino único.

Nota:

Para un entorno multiinquilino, debe configurar la instancia de Azure Bot como multiinquilino y el registro de aplicaciones de Microsoft Entra ID como Cuentas en cualquier directorio organizativo (Cualquier inquilino de Microsoft Entra ID: multiinquilino). Para obtener más información, consulte Aplicaciones de un solo inquilino y de varios inquilinos.

Configuración de una conexión

La biblioteca de autenticación de MSAL permite crear y usar varios clientes distintos con el motor de hospedaje de Agents Framework. Mediante el uso de la biblioteca de autenticación de MSAL, puede proporcionar varias configuraciones de conexión en el archivo de configuración de la aplicación. Cada configuración de conexión puede crear un cliente de autenticación con nombre para admitir comunicaciones con servicios externos u otros agentes.

En las secciones siguientes se describen las opciones de configuración necesarias y opcionales para cada uno de los tipos de autenticación admitidos para el proveedor de autenticación MSAL. También incluyen fragmentos de código de configuración de ejemplo para cada tipo.

Variables de entorno para cada tipo de autenticación

El agente obtiene la configuración de MSAL en tiempo de ejecución a partir de variables de entorno mediante la función auxiliar loadAuthConfigFromEnv(): AuthConfiguration. CloudAdapter se inicializa con AuthConfiguration.

La configuración de conexión usa el formato CONNECTIONS__<CONNECTION_NAME>__SETTINGS__<PROPERTY>.

Cuando AUTHTYPE está presente, el SDK usa ese valor para seleccionar el flujo de adquisición de tokens. Cuando AUTHTYPE se omite, el SDK vuelve al comportamiento heredado e deduce el flujo de autenticación de las propiedades de credenciales configuradas.

Inquilino único con secreto de cliente

Use estas opciones para configurar una conexión de inquilino único que se autentique con un secreto de cliente.

Nombre de configuración Tipo Valor predeterminado Descripción
CLIENTID String Ninguno Identificador de cliente (id. de aplicación) del registro de la aplicación.
CLIENTSECRET String Ninguno Secreto asociado al registro de la aplicación. Use solo con fines de prueba y desarrollo.
TENANTID String Ninguno Identificador de inquilino de Microsoft Entra para el registro de la aplicación.
AUTHTYPE String Ninguno Establécelo en ClientSecret.
ÁMBITO String Ninguno Ámbito de recurso predeterminado para solicitar tokens cuando el autor de la llamada no proporciona uno.
AUTORIDAD String Ninguno Cuando está presente, se usa como la entidad desde la que solicitar un token. Si no se establece, el valor predeterminado es https://login.microsoftonline.com/{TENANTID}.
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__AUTHTYPE=ClientSecret
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID={app-id-guid}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET={app-registration-secret}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID={tenant-id-guid}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__SCOPE=https://api.botframework.com

El inquilino único con secreto de cliente es la configuración recomendada para el desarrollo local.

Multiinquilino con secreto de cliente

Para escenarios de varios inquilinos que usan un secreto de cliente, establezca el punto de conexión de la autoridad en el inquilino botframework.com:

Nombre de configuración Tipo Valor predeterminado Descripción
CLIENTID String Ninguno Identificador de cliente (id. de aplicación) del registro de la aplicación.
CLIENTSECRET String Ninguno Secreto asociado al registro de la aplicación. Use solo con fines de prueba y desarrollo.
AUTHTYPE String Ninguno Establécelo en ClientSecret.
AUTORIDAD String Ninguno Establézcalo en https://login.microsoftonline.com/botframework.com para multicliente.
ÁMBITO String Ninguno Ámbito de recurso predeterminado para solicitar tokens cuando el autor de la llamada no proporciona uno.
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__AUTHTYPE=ClientSecret
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID={app-id-guid}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET={app-registration-secret}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__AUTHORITY=https://login.microsoftonline.com/botframework.com
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__SCOPE=https://api.botframework.com

UserManagedIdentity

Use estas opciones para configurar la adquisición de tokens con una identidad administrada asignada por el usuario.

Nombre de configuración Tipo Valor predeterminado Descripción
CLIENTID String Ninguno El Id. de cliente de identidad administrada que se usará al crear el token de acceso.
AUTHTYPE String Ninguno Establécelo en UserManagedIdentity.
ÁMBITO String Ninguno Ámbito de recurso predeterminado para solicitar tokens cuando el autor de la llamada no proporciona uno.
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__AUTHTYPE=UserManagedIdentity
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID={managed-identity-client-id}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__SCOPE=https://api.botframework.com

Identidad administrada es la configuración recomendada para escenarios de producción. Para más información, consulte Identidades administradas para recursos de Azure.

Nota:

Si usa tipos de identidad administrada, el host o el cliente deben ejecutarse dentro de un servicio de Azure configurado con una identidad administrada asignada por el sistema o asignada por el usuario. Para ver qué servicios de Azure admiten identidades administradas, consulte Identidades administradas para recursos de Azure.

SystemManagedIdentity

Si usa el tipo SystemManagedIdentityde autenticación , se omite el identificador de cliente y se usa la identidad administrada por el sistema para el servicio.

Nombre de configuración Tipo Valor predeterminado Descripción
AUTHTYPE String Ninguno Establécelo en SystemManagedIdentity.
ÁMBITO String Ninguno Ámbito de recurso predeterminado para solicitar tokens cuando el autor de la llamada no proporciona uno.
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__AUTHTYPE=SystemManagedIdentity
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__SCOPE=https://api.botframework.com

Nota:

Si usa tipos de identidad administrada, el host o el cliente deben ejecutarse dentro de un servicio de Azure configurado con una identidad administrada asignada por el sistema o asignada por el usuario. Para ver qué servicios de Azure admiten identidades administradas, consulte Identidades administradas para recursos de Azure.

FederatedCredentials

Use estas opciones para configurar una aplicación de inquilino único que se autentique a través de credenciales federadas.

Nombre de configuración Tipo Valor predeterminado Descripción
CLIENTID String Ninguno Identificador de cliente (id. de aplicación) del registro de la aplicación.
TENANTID String Ninguno Identificador de inquilino de Microsoft Entra para el registro de la aplicación.
AUTHTYPE String Ninguno Establécelo en FederatedCredentials.
AUTORIDAD String Ninguno Cuando está presente, se usa como la entidad desde la que solicitar un token. Si no se establece, el valor predeterminado es https://login.microsoftonline.com/{TENANTID}.
ÁMBITO String Ninguno Ámbito de recurso predeterminado para solicitar tokens cuando el autor de la llamada no proporciona uno.
FICCLIENTID String Ninguno Identificador de cliente de la identidad administrada usado para obtener el token externo para las credenciales federadas.
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__AUTHTYPE=FederatedCredentials
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID={app-id-guid}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID={tenant-id-guid}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__AUTHORITY=https://login.microsoftonline.com/{tenant-id-guid}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__FICCLIENTID={managed-identity-client-id}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__SCOPE=https://api.botframework.com

Para obtener más información, consulte Autenticación mediante credenciales de identidad federada.

WorkloadIdentity

Use esta configuración para configurar la adquisición de tokens mediante Microsoft Entra Workload Identity.

Nombre de configuración Tipo Valor predeterminado Descripción
AUTHTYPE String Ninguno Establécelo en WorkloadIdentity.
CLIENTID String Ninguno Identificador de cliente (id. de aplicación) del registro de la aplicación.
TENANTID String Ninguno Identificador de inquilino de Microsoft Entra para el registro de la aplicación.
AUTORIDAD String Ninguno Cuando está presente, se usa como la entidad desde la que solicitar un token. Si no se establece, el valor predeterminado es https://login.microsoftonline.com/{TENANTID}.
ÁMBITO String Ninguno Ámbito de recurso predeterminado para solicitar tokens cuando el autor de la llamada no proporciona uno.
FEDERATEDTOKENFILE String Ninguno Ruta de acceso al archivo de token federado proporcionado por el entorno de identidad de carga de trabajo.
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__AUTHTYPE=WorkloadIdentity
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID={app-id-guid}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID={tenant-id-guid}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__AUTHORITY=https://login.microsoftonline.com/{tenant-id-guid}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__FEDERATEDTOKENFILE=/var/run/secrets/azure/tokens/azure-identity-token
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__SCOPE=https://api.botframework.com

Inquilino único con certificado de cliente

Use estas opciones para configurar una conexión de inquilino único que se autentique con un certificado de cliente.

Nombre de configuración Tipo Valor predeterminado Descripción
CLIENTID String Ninguno Identificador de cliente (id. de aplicación) del registro de la aplicación.
TENANTID String Ninguno Identificador de inquilino de Microsoft Entra para el registro de la aplicación.
AUTHTYPE String Ninguno Establécelo en Certificate.
CERTPEMFILE String Ninguno Ruta de acceso al archivo de certificado Privacy-Enhanced Mail (PEM).
CERTKEYFILE String Ninguno Ruta de acceso al archivo de clave privada del certificado.
ÁMBITO String Ninguno Ámbito de recurso predeterminado para solicitar tokens cuando el autor de la llamada no proporciona uno.
AUTORIDAD String Ninguno Cuando está presente, se usa como la entidad desde la que solicitar un token.
SENDX5C Booleano Falso Habilita el envío del encabezado x5c durante la adquisición de tokens basada en certificados.
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__AUTHTYPE=Certificate
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID={app-id-guid}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID={tenant-id-guid}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CERTPEMFILE={path-to-pem-file}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CERTKEYFILE={path-to-key-file}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__SCOPE=https://api.botframework.com

Nota:

El SDK de JS lee el certificado PEM y los archivos de clave privada directamente desde el disco y calcula automáticamente la huella digital del certificado. El archivo de clave no debe usar una contraseña.

Multiinquilino con certificado de cliente

Para escenarios de varios inquilinos que usan un certificado de cliente, establezca el punto de conexión de la autoridad en el inquilino botframework.com:

CONNECTIONS__SERVICE_CONNECTION__SETTINGS__AUTHTYPE=Certificate
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID={app-id-guid}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CERTPEMFILE={path-to-pem-file}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CERTKEYFILE={path-to-key-file}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__AUTHORITY=https://login.microsoftonline.com/botframework.com
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__SCOPE=https://api.botframework.com

Compatibilidad con versiones anteriores con el SDK de Azure Bot Framework

Para cargar la configuración con el mismo formato que el SDK de Bot Framework de Azure, use loadPrevAuthConfigFromEnv(): AuthConfiguration.

Use estos nombres de configuración heredados al migrar las configuraciones existentes de Bot Framework SDK.

Nombre de configuración Tipo Valor predeterminado Descripción
MicrosoftAppTenantId String Null Identificador de ID de tenant de Microsoft Entra (formato heredado del SDK de Bot Framework).
MicrosoftAppId String Null El identificador de cliente (id. de aplicación) del registro de la aplicación (formato heredado del SDK de Bot Framework).
MicrosoftAppPassword String Null Secreto de la aplicación (formato heredado del SDK de Bot Framework).
MicrosoftAppTenantId={tenant-id-guid}
MicrosoftAppId={app-id-guid}
MicrosoftAppPassword={app-registration-secret}

Proveedor de autenticación personalizado

Los usuarios que requieren un proveedor de autenticación personalizado pueden implementar la interfaz:

export interface AuthProvider {
  getAccessToken: (authConfig: AuthConfiguration, scope: string) => Promise<string>
}

Por ejemplo, implemente AuthProvider mediante @azure/identity:

import { EnvironmentCredential } from "@azure/identity"
import { AuthProvider, AuthConfiguration } from "@microsoft/agents-hosting"
class DevTokenProvider implements AuthProvider {
  async getAccessToken(authConfig: AuthConfiguration): Promise<string> {
    const id = new EnvironmentCredential()
    const tokenResponse = await id.getToken("https://api.botframework.com/.default")
    return tokenResponse.token
  }

Para crear una instancia de CloudAdapter mediante DevTokenProvider

const adapter = new CloudAdapter(authConfig, new DevTokenProvider())

amework.com/.default") devuelve tokenResponse.token }


To instantiate the `CloudAdapter` by using the `DevTokenProvider`

```ts
const adapter = new CloudAdapter(authConfig, new DevTokenProvider())

El paquete Biblioteca de autenticación de Microsoft del SDK de agentes de Python (MSAL) proporciona herramientas que le ayudan a crear tokens de acceso para clientes de agentes y servicios externos desde un agente autohospedado SDK de agentes de Microsoft 365.

El microsoft-agents-authentication-msal paquete proporciona la MsalAuth clase , que es el proveedor de autenticación principal. Puede configurarlo para los siguientes tipos de credenciales:

  • Secreto de cliente
  • Certificado de cliente
  • Identidad Administrada Asignada por el Usuario
  • Identidad administrada asignada por el sistema

Instalación del paquete de autenticación

Instale el paquete de autenticación de MSAL desde PyPI:

pip install microsoft-agents-authentication-msal

Inquilino único frente a multiinquilino

El secreto de cliente y la autenticación de certificados de cliente admiten configuraciones de inquilino único y multiinquilino.

La identidad administrada asignada por el usuario y la identidad administrada asignada por el sistema solo admiten configuraciones de un solo inquilino.

Nota:

Para varios inquilinos, debe configurar la instancia de Bot de Azure como multiinquilino y el registro de aplicaciones Microsoft Entra ID como Accounts en cualquier directorio organizativo (cualquier inquilino de Microsoft Entra ID: multiinquilino). Para obtener más información, consulte Aplicaciones de uno o varios inquilinos.

Configuración de una conexión

La biblioteca de autenticación de MSAL permite crear y usar varios clientes distintos con el motor de hospedaje de Agents Framework. Cada configuración de conexión crea un cliente de autenticación con nombre para admitir comunicaciones con servicios externos u otros agentes.

Proporcionar la configuración mediante variables de entorno que utilicen la convención de nombres con doble subrayado (__) para opciones de configuración anidadas. La MsalConnectionManager clase lee estas variables para construir AgentAuthConfiguration instancias para cada conexión con nombre.

Importante

El administrador de conexiones requiere como mínimo una conexión denominada SERVICE_CONNECTION.

Variables de entorno para cada tipo de autenticación

El agente obtiene la configuración de MSAL en tiempo de ejecución a partir de variables de entorno mediante la función auxiliar load_configuration_from_env().

En las secciones siguientes se describen las opciones de configuración necesarias para cada uno de los tipos de autenticación admitidos, junto con fragmentos de código de variables de entorno de ejemplo para cada tipo.

Inquilino único con secreto de cliente

Use estas opciones para configurar una conexión de inquilino único que se autentique con un secreto de cliente.

Nombre de configuración Tipo Valor predeterminado Descripción
CLIENTID String Ninguno Identificador de cliente (id. de aplicación) del registro de la aplicación.
CLIENTSECRET String Ninguno Secreto asociado al registro de la aplicación. Use solo con fines de prueba y desarrollo.
TENANTID String Ninguno Identificador de inquilino de Microsoft Entra para el registro de la aplicación.
AUTHTYPE String ClientSecret El tipo de autenticación. Establécelo en ClientSecret.
ÁMBITOS Lista de cadenas Ninguno Lista predeterminada de ámbitos para los que solicitar tokens. Solo se utiliza cuando no se pasan ámbitos desde la solicitud de conexión del agente.
AUTORIDAD String Ninguno Cuando está presente, se usa como la entidad desde la que solicitar un token. Si no se establece, el valor predeterminado es https://login.microsoftonline.com/{TENANTID}.
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__AUTHTYPE=ClientSecret
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID={app-id-guid}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET={app-registration-secret}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID={tenant-id-guid}

El inquilino único con secreto de cliente es la configuración recomendada para el desarrollo local.

Multiinquilino con secreto de cliente

Para escenarios de varios inquilinos que usan un secreto de cliente, establezca el punto de conexión de la autoridad en el inquilino botframework.com:

Nombre de configuración Tipo Valor predeterminado Descripción
CLIENTID String Ninguno Identificador de cliente (id. de aplicación) del registro de la aplicación.
CLIENTSECRET String Ninguno Secreto asociado al registro de la aplicación. Use solo con fines de prueba y desarrollo.
AUTHTYPE String ClientSecret El tipo de autenticación. Establécelo en ClientSecret.
AUTORIDAD String Ninguno Establézcalo en https://login.microsoftonline.com/botframework.com para multicliente.
ÁMBITOS Lista de cadenas Ninguno Lista predeterminada de ámbitos para los que solicitar tokens.
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__AUTHTYPE=ClientSecret
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID={app-id-guid}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET={app-registration-secret}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__AUTHORITY=https://login.microsoftonline.com/botframework.com

Identidad Administrada Asignada por el Usuario

Use estas opciones para configurar la adquisición de tokens con una identidad administrada asignada por el usuario.

Nombre de configuración Tipo Valor predeterminado Descripción
CLIENTID String Ninguno El Id. de cliente de identidad administrada que se usará al crear el token de acceso.
AUTHTYPE String ClientSecret El tipo de autenticación. Establécelo en UserManagedIdentity.
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID={managed-identity-client-id}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__AUTHTYPE=UserManagedIdentity

Identidad administrada es la configuración recomendada para escenarios de producción. Para más información, consulte Identidades administradas para recursos de Azure.

Nota:

Si usa tipos de identidad administrada, el host o el cliente deben ejecutarse dentro de un servicio de Azure configurado con una identidad administrada asignada por el sistema o asignada por el usuario. Para ver qué servicios de Azure admiten identidades administradas, consulte Identidades administradas para recursos de Azure.

Identidad administrada asignada por el sistema

Si usa el tipo SystemManagedIdentityde autenticación , se omite el identificador de cliente y se usa la identidad administrada por el sistema para el servicio.

Nombre de configuración Tipo Valor predeterminado Descripción
AUTHTYPE String ClientSecret El tipo de autenticación. Establécelo en SystemManagedIdentity.
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__AUTHTYPE=SystemManagedIdentity

Nota:

Si usa tipos de identidad administrada, el host o el cliente deben ejecutarse dentro de un servicio de Azure configurado con una identidad administrada asignada por el sistema o asignada por el usuario. Para ver qué servicios de Azure admiten identidades administradas, consulte Identidades administradas para recursos de Azure.

Inquilino único con certificado de cliente

Use estas opciones para configurar una conexión de inquilino único que se autentique con un certificado de cliente.

Nombre de configuración Tipo Valor predeterminado Descripción
CLIENTID String Ninguno Identificador de cliente (id. de aplicación) del registro de la aplicación.
TENANTID String Ninguno Identificador de inquilino de Microsoft Entra para el registro de la aplicación.
AUTHTYPE String ClientSecret El tipo de autenticación. Establécelo en certificate.
CERTPEMFILE String Ninguno Ruta de acceso al archivo de certificado Privacy-Enhanced Mail (PEM).
CERTKEYFILE String Ninguno Ruta de acceso al archivo de clave privada del certificado.
ÁMBITOS Lista de cadenas Ninguno Lista predeterminada de ámbitos para los que solicitar tokens.
AUTORIDAD String Ninguno Cuando está presente, se usa como la entidad desde la que solicitar un token.
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__AUTHTYPE=certificate
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID={app-id-guid}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID={tenant-id-guid}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CERTPEMFILE={path-to-pem-file}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CERTKEYFILE={path-to-key-file}

Nota:

El SDK de Python lee el certificado PEM y los archivos de clave privada directamente desde el disco y calcula automáticamente la huella digital del certificado. El archivo de clave no debe usar una contraseña.

Multiinquilino con certificado de cliente

Para escenarios de varios inquilinos que usan un certificado de cliente, establezca el punto de conexión de la autoridad en el inquilino botframework.com:

CONNECTIONS__SERVICE_CONNECTION__SETTINGS__AUTHTYPE=certificate
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID={app-id-guid}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CERTPEMFILE={path-to-pem-file}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CERTKEYFILE={path-to-key-file}
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__AUTHORITY=https://login.microsoftonline.com/botframework.com

Configuración del administrador de conexiones

La MsalConnectionManager clase puede administrar varias conexiones de autenticación para el agente. Lee las configuraciones de conexión y crea MsalAuth instancias para cada conexión con nombre.

Este es un ejemplo de cómo configurar el administrador de conexiones e iniciar el agente:

from os import environ

from microsoft_agents.hosting.aiohttp import start_agent_process, CloudAdapter
from microsoft_agents.hosting.core import Authorization, AgentApplication, TurnState, MemoryStorage

from dotenv import load_dotenv
from aiohttp.web import Request, Response, Application, run_app
from microsoft_agents.authentication.msal import MsalConnectionManager
from microsoft_agents.activity import load_configuration_from_env

def start_server(
    agent_application: AgentApplication, auth_configuration: AgentAuthConfiguration
):
    async def entry_point(req: Request) -> Response:
        agent: AgentApplication = req.app["agent_app"]
        adapter: CloudAdapter = req.app["adapter"]
        return await start_agent_process(req, agent, adapter)

    APP = Application()
    APP.router.add_post("/api/messages", entry_point)
    APP["agent_configuration"] = auth_configuration
    APP["agent_app"] = agent_application
    APP["adapter"] = agent_application.adapter

    try:
        run_app(APP, host="localhost", port=environ.get("PORT", 3978))
    except Exception as error:
        raise error

load_dotenv()
agents_sdk_config = load_configuration_from_env(environ)

STORAGE = MemoryStorage()
CONNECTION_MANAGER = MsalConnectionManager(**agents_sdk_config)
ADAPTER = CloudAdapter(connection_manager=CONNECTION_MANAGER)
AUTHORIZATION = Authorization(STORAGE, CONNECTION_MANAGER, **agents_sdk_config)

AGENT_APP = AgentApplication[TurnState](
    storage=STORAGE, adapter=ADAPTER, authorization=AUTHORIZATION, **agents_sdk_config
)

start_server(
    agent_application=AGENT_APP, auth_configuration=CONNECTION_MANAGER.get_default_connection_configuration()
)

Consulte el ejemplo de inicio rápido Python para obtener un ejemplo completo del uso de MsalConnectionManager en un agente de Python.

Proveedor de autenticación personalizado

Los usuarios que requieren un proveedor de autenticación personalizado pueden implementar la AccessTokenProviderBase clase base:

from microsoft_agents.hosting.core import AccessTokenProviderBase

class CustomAuthProvider(AccessTokenProviderBase):
    async def get_access_token(
        self, resource_url: str, scopes: list[str], force_refresh: bool = False
    ) -> str:
        # Implement custom token acquisition logic
        token = await your_custom_token_logic(resource_url, scopes)
        return token

Soporte de registro para autenticación

El sistema de autenticación MSAL usa el módulo estándar Python logging bajo el nombre del registrador microsoft_agents.authentication.msal. Para habilitar el registro detallado de flujos de autenticación para solucionar problemas de adquisición de tokens, configure el registrador en la aplicación:

import logging

logging.basicConfig(level=logging.WARNING)
logging.getLogger("microsoft_agents.authentication.msal").setLevel(logging.DEBUG)

Prácticas recomendadas de seguridad

  • Almacene secretos en Azure Key Vault o variables de entorno; nunca los confirme en el código fuente.
  • Use identidades administradas siempre que sea posible, ya que eliminan la necesidad de administrar secretos.
  • Cambiar periódicamente los secretos del cliente y los certificados.
  • Use el principio de privilegios mínimos para ámbitos y permisos.