Skip to content

Delegando la Identidad: Microsoft Entra External ID

Con nuestro servidor y DNS listos, es hora de abordar uno de los pilares de cualquier aplicación moderna: la identidad. En lugar de construir nuestro propio sistema de autenticación (una tarea compleja y propensa a errores), delegaremos esta responsabilidad a un proveedor de identidad de nivel mundial: Microsoft Entra External ID.

En esta guía visual, no solo configuraremos un simple inicio de sesión. Iremos un paso más allá para construir un sistema de identidad flexible, extensible y, lo más importante, desacoplado de nuestro ecosistema, gracias al poder de las Custom Authentication Extensions.

Esta guía está diseñada para ser un recorrido visual paso a paso por el proceso de configuración de Microsoft Entra ID, desde la creación de grupos hasta la implementación de extensiones personalizadas que enriquecen la experiencia del usuario.

Fase 1: Preparando el Terreno - Grupos y Roles

Section titled “Fase 1: Preparando el Terreno - Grupos y Roles”

Antes de registrar aplicaciones, crearemos un grupo que nos servirá en el futuro para gestionar el control de acceso basado en roles (RBAC).

  1. Panel Principal de Microsoft Entra Esta es la página de bienvenida de nuestro tenant de Entra ID, “CodeDesignPlus-Dev”. Desde aquí, navegaremos a las diferentes secciones de configuración.

    Panel principal de Microsoft Entra
  2. Sección de Grupos En el menú de la izquierda, navegamos a Identity > Groups y hacemos clic en el botón “New group”.

    Sección de Grupos en Entra ID
  3. Creando el Grupo “Super Admin” Configuramos nuestro primer grupo, que representará a los administradores del sistema:

    • Group type: Security
    • Group name: Super Admin
    • Membership type: Assigned (asignaremos miembros manualmente). Hacemos clic en “Create”.
    Creando un nuevo grupo de seguridad
  4. Verificación del Grupo Creado Tras una breve notificación de éxito, podemos ver nuestro nuevo grupo “Super Admin” listado en la sección “All groups”. Este grupo será crucial más adelante para proteger nuestras APIs y funcionalidades administrativas.

    Notificación de grupo creado exitosamente Grupo Super Admin listado

Fase 2: Registrando Nuestra Aplicación Frontend

Section titled “Fase 2: Registrando Nuestra Aplicación Frontend”

Ahora, registraremos nuestra aplicación de inventario como una entidad que Entra ID puede reconocer y autenticar.

  1. Sección de Registro de Aplicaciones Navegamos a Identity > Applications > App registrations y hacemos clic en ”+ New registration”.

    Sección de Registro de Aplicaciones
  2. Configurando el Registro de la App

    • Name: InventoryApp
    • Supported account types: Dejamos la opción por defecto, “Accounts in this organizational directory only”.
    • Redirect URI: Seleccionamos Single-page application (SPA) e introducimos http://localhost:4200, que es la dirección donde correrá nuestra app de Angular durante el desarrollo. Hacemos clic en “Register”.
    Formulario de registro de una nueva aplicación
  3. Panel de la Aplicación Registrada ¡Nuestra InventoryApp ya existe en Entra ID! Esta pantalla nos muestra información crucial como el Application (client) ID y el Directory (tenant) ID, que usaremos en la configuración de nuestro frontend.

    Panel de control de la aplicación InventoryApp

Fase 3: Personalizando la Información del Usuario

Section titled “Fase 3: Personalizando la Información del Usuario”

Entra ID nos permite extender el esquema de usuario estándar con atributos personalizados que son relevantes para nuestra aplicación.

  1. Navegando a Atributos Personalizados Desde el menú principal, vamos a External Identities > Custom user attributes. Aquí podemos definir campos de datos adicionales que se solicitarán al usuario.

    Navegando a External Identities Panel de Custom user attributes
  2. Añadiendo el Atributo “Phone” Hacemos clic en ”+ Add” para crear un nuevo atributo. Lo llamamos Phone con un Data Type de String. Tras crearlo, aparecerá en nuestra lista de atributos personalizados.

    Añadiendo un nuevo atributo personalizado Atributo Phone añadido a la lista

El “User Flow” define la experiencia de registro e inicio de sesión que verán nuestros usuarios.

  1. Sección de Flujos de Usuario Vamos a External Identities > User flows y hacemos clic en ”+ New user flow”.

    Sección de User Flows
  2. Configurando el Flujo de Registro

    • Name: InventoryApp-SignUp
    • Identity providers: Marcamos Email with password.
    • User attributes: Seleccionamos los campos que queremos que el usuario rellene al registrarse y que queremos que se devuelvan en el token. Marcamos: Display Name, Given Name, Surname y nuestro atributo personalizado Phone.
    Configurando un nuevo User Flow Seleccionando los atributos del usuario para el flujo
  3. Flujo de Usuario Creado Hacemos clic en “Create” y nuestro flujo InventoryApp-SignUp (de tipo “Sign up and sign in”) está listo para ser usado y personalizado.

    User Flow creado exitosamente

Aquí es donde integramos profundamente Entra ID con nuestro ecosistema CodeDesignPlus. Crearemos “webhooks” que se dispararán en momentos clave del proceso de autenticación para ejecutar nuestra propia lógica.

  1. Sub-fase 5.1: Creando la Extensión de Sincronización Navegamos a External Identities > Custom authentication extensions y hacemos clic en + Create a custom extension. Seleccionamos el evento AttributeCollectionSubmit.

    Navegando a Custom authentication extensions Seleccionando el evento AttributeCollectionSubmit
  2. Configurando el Endpoint

    • Name: InventoryApp - AttributeCollectionSubmit
    • Target URL: La URL de nuestro microservicio: https://services.codedesignplus.app/ms-microsoft-graph/api/identity/provider/AttributeCollectionSubmit
    • Hacemos clic en “Next”.
    Configurando el endpoint de la extensión
  3. Registrando la App para la Extensión La extensión necesita su propia identidad para llamar a nuestra API de forma segura. Seleccionamos Create new app registration y le damos un nombre, InventoryApp - CustomAuthenticationExtension.

    Creando un nuevo registro de app para la extensión
  4. Revisión y Concesión de Permisos Revisamos la configuración y creamos la extensión. Importante: Se nos pedirá conceder permisos para que la extensión pueda llamar a nuestra API. Hacemos clic en Grant permission y aceptamos en la ventana emergente.

    Revisando y creando la extensión Otorgando permisos a la extensión Ventana de consentimiento de permisos
  5. Permiso Configurado El estado del permiso ahora es “Configured”. ¡Nuestra primera extensión está lista!

    Estado del permiso configurado
  6. Sub-fase 5.2: Creando la Extensión de Enriquecimiento del Token Repetimos el proceso, pero esta vez seleccionamos el evento TokenIssuanceStart. Le damos un nombre (InventoryApp - Token Issuance) y la URL correspondiente de nuestro microservicio.

    Lista de extensiones creadas Seleccionando el evento TokenIssuanceStart Configurando el endpoint de la extensión Token Issuance
  7. Reutilizando el Registro de App Esta vez, en lugar de crear una nueva app, seleccionamos Select an existing app registration y elegimos la app que creamos en el paso anterior (InventoryApp - CustomAuthenticationExtension), ya que es la misma entidad la que llama a nuestra API.

    Seleccionando un registro de app existente Eligiendo la app de extensión existente
  8. Configurando los Claims En la pestaña “Claims”, definimos qué datos devolverá nuestra API. Añadimos un claim llamado userId. Revisamos y creamos la extensión. Como ya dimos permisos a la app, el estado aparecerá como “Configured” directamente.

    Añadiendo el claim userId a la extensión Revisando y creando la extensión Token Issuance Extensión Token Issuance creada y configurada
  9. Ambas Extensiones Listas Ahora tenemos nuestras dos extensiones listas para ser asociadas a nuestro flujo de usuario.

    Lista de las dos extensiones personalizadas
  10. Sub-fase 5.3: Asociando la Extensión al Flujo de Usuario Volvemos a nuestro User Flow (InventoryApp-SignUp), vamos a la sección Custom authentication extensions, y en el paso “When a user submits their information”, seleccionamos nuestra extensión InventoryApp - AttributeCollectionSubmit. Guardamos los cambios.

    Navegando al User Flow Entrando a las extensiones del User Flow Asociando la extensión AttributeCollectionSubmit Guardando la asociación de la extensión Notificación de guardado exitoso

El último paso es asegurarnos de que toda la información que necesitamos (incluyendo nuestros claims personalizados y los grupos de roles) se incluya en el token JWT final.

  1. Navegando a Enterprise Applications Volvemos a App registrations, pero esta vez entramos a nuestra app InventoryApp y hacemos clic en el enlace bajo “Managed application in local directory”. Esto nos lleva a la “Enterprise Application”, que es donde se configuran los claims y el SSO.

    Lista de App Registrations Panel de la App Registration con enlace a la Enterprise App
  2. Configurando Claims OIDC Vamos a Single sign-on y en la sección “Attributes & Claims”, hacemos clic en “Edit”.

    Panel de Single sign-on de la Enterprise App Panel de Attributes & Claims
  3. Conectando el Proveedor de Claims Personalizado En “Custom claims provider”, hacemos clic en “Configure”. En el desplegable, seleccionamos nuestra extensión InventoryApp - Token Issuance y guardamos. Con esto, le decimos a Entra que, antes de emitir un token, debe llamar a nuestra API para obtener datos adicionales.

    Configurando el Custom claims provider Seleccionando la extensión Token Issuance Proveedor de claims personalizado configurado
  4. Mapeando los Claims Ahora, añadimos nuevos claims (+ Add new claim) y los mapeamos a los atributos que nos devuelve nuestro proveedor personalizado:

    • givenname -> customclaimsprovider.user.givenname
    • surname -> customclaimsprovider.user.surname
    • displayName -> customclaimsprovider.user.displayName
    • phone -> customclaimsprovider.user.mobilePhone
    • userid -> customclaimsprovider.userId (¡El más importante!)
    Añadiendo el claim givenname Añadiendo el claim surname Añadiendo el claim displayName Añadiendo el claim phone Añadiendo el claim userid
  5. Lista Final de Claims Adicionales Nuestra configuración de claims ahora está completa, incluyendo nuestro userid interno.

    Lista final de claims adicionales configurados
  6. Añadiendo el Claim de Grupos Volvemos al registro de la app original (InventoryApp), vamos a Token configuration, hacemos clic en + Add groups claim, seleccionamos Security groups y personalizamos el ID para que se emita como groups. Esto incluirá los roles del usuario (como “Super Admin”) en el token.

    Navegando a Token configuration Añadiendo un groups claim Configurando el groups claim Claim de grupos añadido
  7. Vista Final de Claims Ahora, al volver a la sección de claims de la Enterprise App, vemos que el claim groups también aparece, completando nuestra configuración.

    Vista final de todos los claims configurados

Fase 7: Configurando Permisos de API para la Extensión

Section titled “Fase 7: Configurando Permisos de API para la Extensión”

Finalmente, nuestra extensión (InventoryApp - CustomAuthenticationExtension) necesita permisos para leer información de los usuarios desde Microsoft Graph API.

  1. Navegando a los Permisos de API Vamos a App registrations, seleccionamos nuestra app InventoryApp - CustomAuthenticationExtension y vamos a la sección API permissions.

    Navegando a API permissions
  2. Añadiendo Permisos de Microsoft Graph Hacemos clic en + Add a permission, seleccionamos Microsoft Graph, y luego Application permissions. Buscamos y añadimos los siguientes permisos:

    • DeviceManagementConfiguration.Read.All y Write.All
    • Directory.Read.All y Write.All
    • Group.Read.All y Write.All
    • GroupMember.ReadWrite.All
    • User.EnableDisable.All
    • User.Read.All y Write.All
    Añadiendo un nuevo permiso Seleccionando Microsoft Graph Seleccionando permisos de aplicación Añadiendo permisos DeviceManagementConfiguration Añadiendo permisos Directory Añadiendo permisos Group Añadiendo permisos GroupMember Añadiendo permisos User.EnableDisable Añadiendo permisos User
  3. Otorgando Consentimiento de Administrador La lista de permisos ahora está completa, pero requieren consentimiento. Hacemos clic en Grant admin consent for CodeDesignPlus-Dev, confirmamos, y veremos que todos los permisos tienen el estado “Granted”.

    Lista de permisos pendientes de consentimiento Otorgando consentimiento de administrador Permisos concedidos exitosamente
  4. Creando un Secreto de Cliente Para que nuestro microservicio ms-microsoft-graph se autentique, necesita un secreto. Vamos a Certificates & secrets, creamos un New client secret, le damos una descripción y una duración. ¡MUY IMPORTANTE! Copia el valor del secreto inmediatamente, ya que no volverá a mostrarse.

    Creando un nuevo secreto de cliente Configurando la descripción y expiración del secreto Copiando el valor del secreto de cliente

¡Ha sido un viaje intenso, pero el resultado es espectacular! No solo hemos configurado un inicio de sesión; hemos construido un sistema de identidad robusto, extensible y desacoplado que nos da un control total sobre los datos de nuestros usuarios y la información que viaja en nuestros tokens.

Hemos sentado las bases para un sistema seguro y escalable. En los próximos artículos, empezaremos a consumir estas configuraciones desde nuestros microservicios y frontend, y veremos cómo toda esta preparación cobra vida.