Solucionar problemas de la extensión de autenticación personalizada
Los eventos de autenticación y los proveedores de notificaciones personalizados permiten personalizar la experiencia de autenticación de Microsoft Entra mediante la integración con sistemas externos. Por ejemplo, puede crear una API del proveedor de notificaciones personalizado y configurar una aplicación OpenID Connect o una aplicación SAML para recibir tokens con notificaciones de un almacén externo.
Comportamiento de error
Cuando se produce un error en una llamada API, el comportamiento del error es el siguiente:
- En el caso de las aplicaciones de OpenId Connect: Microsoft Entra ID redirige al usuario a la aplicación cliente con un error. No se acuña ningún token.
- En el caso de las aplicaciones SAML: Microsoft Entra ID muestra al usuario una pantalla de error en la experiencia de autenticación. El usuario no se redirige de nuevo a la aplicación cliente.
El código de error que se devuelve a la aplicación o al usuario es genérico. Para solucionar problemas, compruebe los registros de inicio de sesión de los códigos de error.
Registro
Para solucionar problemas con el punto de conexión de la API de REST del proveedor de notificaciones personalizado, la API de REST debe controlar el registro. Azure Functions y otras plataformas de desarrollo de API proporcionan soluciones de registro detalladas. Use esas soluciones para obtener información detallada sobre el comportamiento de las API y solucionar problemas con la lógica de la API.
Registros de inicio de sesión de Microsoft Entra
Sugerencia
Los pasos de este artículo pueden variar ligeramente en función del portal desde donde comienza.
También puede usar los registros de inicio de sesión de Microsoft Entra además de los registros de la API de REST y las soluciones de diagnóstico del entorno de hospedaje. Al usar los registros de inicio de sesión de Microsoft Entra podría encontrar errores, lo que puede afectar al inicio de sesión de los usuarios. Los registros de inicio de sesión de Microsoft Entra proporcionan información sobre el estado HTTP, el código de error, la duración de la ejecución y el número de reintentos a los que Microsoft Entra ID llamó a la API.
Los registros de inicio de sesión de Microsoft Entra también se integran con Azure Monitor. Puede configurar las alertas y la supervisión, visualizar los datos e integrarlos con las herramientas de administración de eventos e información de seguridad (SIEM). Por ejemplo, puede configurar notificaciones si el número de errores supera un umbral determinado que elija.
Para acceder a los registros de inicio de sesión de Microsoft Entra:
Inicie sesión en el Centro de administración de Microsoft Entra como Administrador de aplicaciones en la nube.
Vaya a Aplicaciones de identidad>Aplicaciones>Empresariales.
Seleccione Registros de inicio de sesión y, a continuación, seleccione el registro de inicio de sesión más reciente.
Para obtener más información, seleccione la pestaña Eventos de autenticación. Se muestra información relacionada con la llamada a la API de REST de la extensión de autenticación personalizada, incluidos los códigos de error.
Referencia de los códigos de error
Use la tabla siguiente para diagnosticar un código de error.
Código de error | Nombre del error | Descripción |
---|---|---|
1003000 | EventHandlerUnexpectedError | Error inesperado al procesar un controlador de eventos. |
1003001 | CustomExtenstionUnexpectedError | Error inesperado al llamar a una API de extensión personalizada. |
1003002 | CustomExtensionInvalidHTTPStatus | La API de extensión personalizada devolvió un código de estado HTTP no válido. Compruebe que la API devuelva un código de estado aceptado definido para ese tipo de extensión personalizado. |
1003003 | CustomExtensionInvalidResponseBody | Hubo un problema al analizar el cuerpo de respuesta de la extensión personalizada. Compruebe que el cuerpo de respuesta de la API esté en un esquema aceptable para ese tipo de extensión personalizada. |
1003004 | CustomExtensionThrottlingError | Hay demasiadas solicitudes de extensión personalizadas. Esta excepción se produce para las llamadas API de la extensión personalizada cuando se alcanzan los límites. |
1003005 | CustomExtensionTimedOut | La extensión personalizada no respondió dentro del tiempo de espera permitido. Compruebe que la API responde dentro del tiempo de espera configurado para la extensión personalizada. También podría indicar que el token de acceso no es válido. Siga los pasos para llamar directamente a la API de REST. |
1003006 | CustomExtensionInvalidResponseContentType | El tipo de contenido de respuesta de la extensión personalizada no es "application/json". |
1003007 | CustomExtensionNullClaimsResponse | La API de extensión personalizada respondió con un contenedor de notificaciones null. |
1003008 | CustomExtensionInvalidResponseApiSchemaVersion | La API de extensión personalizada no respondió con la misma apiSchemaVersion a la que se llamó. |
1003009 | CustomExtensionEmptyResponse | El cuerpo de respuesta de la API de extensión personalizada era null cuando no se esperaba. |
1003010 | CustomExtensionInvalidNumberOfActions | La respuesta de la API de extensión personalizada incluía un número diferente de acciones que las admitidas para ese tipo de extensión personalizada. |
1003011 | CustomExtensionNotFound | No se encontró la extensión personalizada asociada a un agente de escucha de eventos. |
1003012 | CustomExtensionInvalidActionType | La extensión personalizada devolvió un tipo de acción no válido definido para ese tipo de extensión personalizada. |
1003014 | CustomExtensionIncorrectResourceIdFormat | La propiedad identifierUris del manifiesto para el registro de aplicación para la extensión personalizada debe tener el formato "api://{nombre de dominio completo}/{appid}. |
1003015 | CustomExtensionDomainNameDoesNotMatch | TargetUrl y resourceId de la extensión personalizada deben tener el mismo nombre de dominio completo. |
1003016 | CustomExtensionResourceServicePrincipalNotFound | El valor appId de la extensión personalizada resourceId debe corresponder a una entidad de servicio real del inquilino. |
1003017 | CustomExtensionClientServicePrincipalNotFound | La entidad de servicio del recurso de extensión personalizada no se encuentra en el inquilino. |
1003018 | CustomExtensionClientServiceDisabled | La entidad de servicio de recursos de la extensión personalizada está deshabilitada en este inquilino. |
1003019 | CustomExtensionResourceServicePrincipalDisabled | La entidad de servicio de recursos de la extensión personalizada está deshabilitada en este inquilino. |
1003020 | CustomExtensionIncorrectTargetUrlFormat | La dirección URL de destino tiene un formato incorrecto. Debe ser una dirección URL válida que empiece por https. |
1003021 | CustomExtensionPermissionNotGrantedToServicePrincipal | La entidad de servicio no tiene el consentimiento del administrador para el rol de aplicación de Microsoft Graph CustomAuthenticationExtensions.Receive.Payload (también conocido como permiso de aplicación), que es necesario para que la aplicación reciba solicitudes HTTP de extensión de autenticación personalizadas. |
1003022 | CustomExtensionMsGraphServicePrincipalDisabledOrNotFound | La entidad de servicio de MS Graph está deshabilitada o no se encuentra en este inquilino. |
1003023 | CustomExtensionBlocked | El servicio bloquea el punto de conexión utilizado para la extensión personalizada. |
1003024 | CustomExtensionResponseSizeExceeded | El tamaño de respuesta de la extensión personalizada superó el límite máximo. |
1003025 | CustomExtensionResponseClaimsSizeExceeded | El tamaño total de las notificaciones en la respuesta de la extensión personalizada superó el límite máximo. |
1003026 | CustomExtensionNullOrEmptyClaimKeyNotSupported | La API de extensión personalizada respondió con notificaciones que contienen una clave null o vacía. |
1003027 | CustomExtensionConnectionError | Error al conectarse a la API de la extensión personalizada. |
Llamar directamente a la API de REST
La API de REST está protegida por el token de acceso de Microsoft Entra. Puede probar la API mediante:
- La obtención de un token de acceso con el registro de aplicación asociado a las extensiones de autenticación personalizadas
- Prueba la API localmente mediante una herramienta de prueba de API.
Para fines de desarrollo y pruebas, abra local.settings.json y reemplace el código por el siguiente JSON:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "", "AzureWebJobsSecretStorageType": "files", "FUNCTIONS_WORKER_RUNTIME": "dotnet", "AuthenticationEvents__BypassTokenValidation" : false } }
Nota:
Si usó el paquete NuGet Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents, asegúrese de establecer
"AuthenticationEvents__BypassTokenValidation" : true
con fines de prueba.Con la herramienta de prueba de API preferida, cree una nueva solicitud HTTP y establezca el método HTTP en
POST
.Use el siguiente cuerpo JSON que imita la solicitud que Microsoft Entra ID envía a la API de REST.
{ "type": "microsoft.graph.authenticationEvent.tokenIssuanceStart", "source": "/tenants/aaaabbbb-0000-cccc-1111-dddd2222eeee/applications/00001111-aaaa-2222-bbbb-3333cccc4444", "data": { "@odata.type": "microsoft.graph.onTokenIssuanceStartCalloutData", "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee", "authenticationEventListenerId": "11112222-bbbb-3333-cccc-4444dddd5555", "customAuthenticationExtensionId": "22223333-cccc-4444-dddd-5555eeee6666", "authenticationContext": { "correlationId": "aaaa0000-bb11-2222-33cc-444444dddddd", "client": { "ip": "127.0.0.1", "locale": "en-us", "market": "en-us" }, "protocol": "OAUTH2.0", "clientServicePrincipal": { "id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb", "appId": "00001111-aaaa-2222-bbbb-3333cccc4444", "appDisplayName": "My Test application", "displayName": "My Test application" }, "resourceServicePrincipal": { "id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb", "appId": "00001111-aaaa-2222-bbbb-3333cccc4444", "appDisplayName": "My Test application", "displayName": "My Test application" }, "user": { "companyName": "Casey Jensen", "createdDateTime": "2023-08-16T00:00:00Z", "displayName": "Casey Jensen", "givenName": "Casey", "id": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee", "mail": "casey@contoso.com", "onPremisesSamAccountName": "Casey Jensen", "onPremisesSecurityIdentifier": "<Enter Security Identifier>", "onPremisesUserPrincipalName": "Casey Jensen", "preferredLanguage": "en-us", "surname": "Jensen", "userPrincipalName": "casey@contoso.com", "userType": "Member" } } } }
Sugerencia
Si usa un token de acceso obtenido de Microsoft Entra ID, seleccione Autorización y, a continuación, seleccione Token de portadory pegue el token de acceso que recibió de Microsoft Entra ID.
Seleccione Enviar y debería recibir una respuesta JSON similar a la siguiente:
{ "data": { "@odata.type": "microsoft.graph.onTokenIssuanceStartResponseData", "actions": [ { "@odata.type": "microsoft.graph.tokenIssuanceStart.provideClaimsForToken", "claims": { "customClaim1": "customClaimValue1", "customClaim2": [ "customClaimString1", "customClaimString2" ] } } ] } }
Mejoras importantes del rendimiento
Uno de los problemas más comunes es que la API del proveedor de notificaciones personalizado no responde dentro del tiempo de espera de dos segundos. Si la API de REST no responde en reintentos posteriores, se produce un error en la autenticación. Para mejorar el rendimiento de la API de REST, siga estas sugerencias:
- Si la API accede a cualquier API de bajada, almacene en caché el token de acceso usado para llamar a estas API para que no sea necesario tener que adquirir un nuevo token en cada ejecución.
- Los problemas de rendimiento suelen estar relacionados con los servicios de bajada. Agregue el registro, que registrará el tiempo del proceso para llamar a cualquier servicio de bajada.
- Si usa un proveedor de nube para hospedar la API, use un plan de hospedaje que mantenga la API siempre "activa". Para Azure Functions, puede ser el plan Premium o el plan Dedicado.
- Ejecute pruebas de integración automatizadas para las autenticaciones. También puedes usar las herramientas de prueba de API para probar solo el rendimiento de la API.