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.
Guía de Configuración Visual
Section titled “Guía de Configuración Visual”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).
-
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.
-
Sección de Grupos En el menú de la izquierda, navegamos a
Identity > Groups
y hacemos clic en el botón “New group”. -
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”.
- Group type:
-
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.
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.
-
Sección de Registro de Aplicaciones Navegamos a
Identity > Applications > App registrations
y hacemos clic en ”+ New registration”. -
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 introducimoshttp://localhost:4200
, que es la dirección donde correrá nuestra app de Angular durante el desarrollo. Hacemos clic en “Register”.
- Name:
-
Panel de la Aplicación Registrada ¡Nuestra
InventoryApp
ya existe en Entra ID! Esta pantalla nos muestra información crucial como elApplication (client) ID
y elDirectory (tenant) ID
, que usaremos en la configuración de nuestro frontend.
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.
-
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. -
Añadiendo el Atributo “Phone” Hacemos clic en ”+ Add” para crear un nuevo atributo. Lo llamamos
Phone
con unData Type
deString
. Tras crearlo, aparecerá en nuestra lista de atributos personalizados.
Fase 4: Creando el Flujo de Usuario
Section titled “Fase 4: Creando el Flujo de Usuario”El “User Flow” define la experiencia de registro e inicio de sesión que verán nuestros usuarios.
-
Sección de Flujos de Usuario Vamos a
External Identities > User flows
y hacemos clic en ”+ New user flow”. -
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 personalizadoPhone
.
- Name:
-
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.
Fase 5: Custom Authentication Extensions
Section titled “Fase 5: Custom Authentication Extensions”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.
-
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 eventoAttributeCollectionSubmit
. -
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”.
- Name:
-
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
. -
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. -
Permiso Configurado El estado del permiso ahora es “Configured”. ¡Nuestra primera extensión está lista!
-
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. -
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. -
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. -
Ambas Extensiones Listas Ahora tenemos nuestras dos extensiones listas para ser asociadas a nuestro flujo de usuario.
-
Sub-fase 5.3: Asociando la Extensión al Flujo de Usuario Volvemos a nuestro
User Flow
(InventoryApp-SignUp
), vamos a la secciónCustom authentication extensions
, y en el paso “When a user submits their information”, seleccionamos nuestra extensiónInventoryApp - AttributeCollectionSubmit
. Guardamos los cambios.
Fase 6: Configurando los Claims del Token
Section titled “Fase 6: Configurando los Claims del Token”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.
-
Navegando a Enterprise Applications Volvemos a
App registrations
, pero esta vez entramos a nuestra appInventoryApp
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. -
Configurando Claims OIDC Vamos a
Single sign-on
y en la sección “Attributes & Claims”, hacemos clic en “Edit”. -
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. -
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!)
-
Lista Final de Claims Adicionales Nuestra configuración de claims ahora está completa, incluyendo nuestro
userid
interno. -
Añadiendo el Claim de Grupos Volvemos al registro de la app original (
InventoryApp
), vamos aToken configuration
, hacemos clic en+ Add groups claim
, seleccionamosSecurity groups
y personalizamos elID
para que se emita comogroups
. Esto incluirá los roles del usuario (como “Super Admin”) en el token. -
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.
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.
-
Navegando a los Permisos de API Vamos a
App registrations
, seleccionamos nuestra appInventoryApp - CustomAuthenticationExtension
y vamos a la secciónAPI permissions
. -
Añadiendo Permisos de Microsoft Graph Hacemos clic en
+ Add a permission
, seleccionamosMicrosoft Graph
, y luegoApplication permissions
. Buscamos y añadimos los siguientes permisos:DeviceManagementConfiguration.Read.All
yWrite.All
Directory.Read.All
yWrite.All
Group.Read.All
yWrite.All
GroupMember.ReadWrite.All
User.EnableDisable.All
User.Read.All
yWrite.All
-
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”. -
Creando un Secreto de Cliente Para que nuestro microservicio
ms-microsoft-graph
se autentique, necesita un secreto. Vamos aCertificates & secrets
, creamos unNew 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.
Conclusión
Section titled “Conclusión”¡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.