Las aplicaciones modernas se alejan cada vez más de las contraseñas tradicionales y adoptan métodos de autenticación sin contraseña que son más seguros y fáciles para los usuarios. En esta publicación, mostraré cómo autenticar usuarios en una aplicación ASP.NET Core generada por IA usando FoxIDs con OpenID Connect y habilitar una experiencia de inicio de sesión completamente sin contraseña usando códigos de un solo uso enviados por correo electrónico.

Comenzaremos desde un entorno FoxIDs limpio, crearemos una nueva aplicación web ASP.NET Core, la conectaremos con OpenID Connect y finalmente habilitaremos el inicio de sesión de passwordless con OTP basado en correo electrónico.

Creación de un entorno de desarrollo FoxIDs

Comencé creando un nuevo entorno de desarrollo vacío en FoxIDs. Un entorno limpio simplifica la configuración de la autenticación desde cero y garantiza que pueda replicar estos pasos en su propio tenant.

Entorno vacío FoxIDs

Si no ha utilizado FoxIDs antes, puede crear un tenant gratuito en:

https://www.foxids.com

Cada tenant viene con dos entornos listos para usar para que puedas experimentar libremente.

Configurar autenticación

Comience con configuring cómo deben iniciar sesión los usuarios. En este caso, queremos que los usuarios inicien sesión sin contraseña, usando solo su dirección de correo electrónico y una contraseña de un solo uso (OTP) que se les envió.

  1. Seleccione la pestaña Autenticaciones en su entorno FoxIDs.
  2. Haga clic en Predeterminado: IU de inicio de sesión de usuario.
  3. En la sección Autenticación, deshabilite Autenticación con contraseña y habilite Sin contraseña con correo electrónico (contraseña de un solo uso).
  4. Haga clic en Actualizar para guardar los cambios.
Configurar el método de inicio de sesión de autenticación

Esto permite a los usuarios crear una nueva cuenta y proporciona una experiencia sin contraseña en la que se autentican simplemente ingresando su dirección de correo electrónico y el OTP que reciben.

Generar la aplicación ASP.NET Core

A continuación, necesitamos una aplicación para autenticarnos. Puede utilizar el mensaje AI para generar una nueva aplicación ASP.NET Core Razor Pages dirigida a .NET 10 o agregar OpenID Connect a una aplicación existente.

Lea la publicación “Autenticación sin contraseña en ASP.NET Core con FoxIDs y OTP basada en correo electrónico” si desea crear la aplicación ASP.NET Core a mano.

Para este tutorial, estoy generando una aplicación ASP.NET Core simple en VS Code con Codex. También puedes usar Copilot.

Eres un desarrollador experto en ASP.NET Core.

Objetivo: crear (o actualizar) una aplicación web ASP.NET Core que autentique a los usuarios con FoxIDs usando OpenID Connect (flujo de código de autorización), utilizando autenticación de cookies para la sesión local y OIDC como esquema de desafío.

### Modo (elige uno)
- MODE = "NEW_APP" -> crear una nueva aplicación Razor Pages
- MODE = "EXISTING_APP" -> modificar la solución actual sin romper rutas/páginas existentes

MODE: {{MODE}}

### Detalles de la aplicación
- ProjectName: {{PROJECT_NAME}} (se usa solo si MODE = "NEW_APP")
- TargetFramework: net10.0 (o mantener existente si es más nuevo)
- URL local de HTTPS (debe coincidir con la dirección base del URI de redireccionamiento FoxIDs): {{APP_BASE_URL}} (ejemplo: https://localhost:7283/)

### Configuración FoxIDs OIDC
No codifique Authority, ClientId o ClientSecret en el código o en este mensaje.
En cambio:
- Léelos desde las claves de configuración:
  - "IdentitySettings:Authority"
  - "IdentitySettings:ClientId"
  - "IdentitySettings:ClientSecret"
- La respuesta final debe explicar claramente al usuario dónde y cómo establecer estos valores de configuración (por ejemplo, en appsettings.json, variables de entorno o secretos de usuario).

### Requisitos de implementación

1) Agregue autenticación en Program.cs:
   - Configurar la autenticación:
     - DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme
     - DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme
   - Agregue autenticación de cookies.
   - Agregue autenticación OpenID Connect:
     - Authority desde la configuración: "IdentitySettings:Authority"
     - ClientId desde la configuración: "IdentitySettings:ClientId"
     - ClientSecret desde la configuración: "IdentitySettings:ClientSecret"
     - ResponseType = "code"
     - SaveTokens = true
     - Scopes: "openid", "profile", "email", "offline_access"
     - MapInboundClaims = false
     - TokenValidationParameters:
       - NameClaimType = "sub"
       - RoleClaimType = "role"
   - Agregue OpenIdConnectEvents con:
     - OnAuthenticationFailed: solo en Development, devuelve una respuesta simple en texto plano con el mensaje de excepción para la depuración. Nunca exponga detalles de excepción o PII en producción.
   - Asegúrese de que el middleware esté registrado:
     - app.UseAuthentication() se llama antes que app.UseAuthorization().

2) Agregar cableado de configuración:
   - Agregue una sección `IdentitySettings` en appsettings.json que contenga solo valores de marcador de posición no secretos, por ejemplo:
     - "Authority": "https://your-foxids-authority/"
     - "ClientId": "your-client-id"
   - Lea "IdentitySettings:ClientSecret" desde la configuración, pero almacene su valor en los secretos de usuario .NET para el desarrollo local o una variable de entorno o un almacén secreto seguro en producción.
   - Si MODE = "EXISTING_APP", combine esta sección con la configuración existente sin sobrescribir configuraciones no relacionadas.
   - Agregue comentarios o texto explicativo en la respuesta final que:
     - Estos valores deben ser reemplazados por el usuario con sus FoxIDs Authority, ClientId y ClientSecret reales.
     - Los secretos no se deben escribir en appsettings.json ni comprometerse con el control de código fuente.

3) Agregar puntos finales de inicio/cierre de sesión:
   - Cree `Controllers/AuthController.cs` con un controlador MVC estándar:
     - Utilice el patrón de ruta `[controller]/[action]`.
   - Acción de inicio de sesión (GET):
     - Si el usuario ya está autenticado, redirija a "/".
     - De lo contrario, emita un Challenge utilizando el OpenIdConnectDefaults.AuthenticationScheme con RedirectUri = "/".
   - Acción de cierre de sesión (POST, con [ValidateAntiForgeryToken]):
     - Si el usuario no está autenticado, redirija a "/".
     - De lo contrario, SignOut de:
       - CookieAuthenticationDefaults.AuthenticationScheme, y
       - OpenIdConnectDefaults.AuthenticationScheme
con un RedirectUri = "/".

4) Agregar inicio de sesión de UI parcial:
   - Cree `Pages/Shared/_LoginPartial.cshtml`.
   - Comportamiento:
     - Si el usuario está autenticado:
       - Muestra un botón "Cerrar sesión" que publica en `Auth/Logout` con un token antifalsificación.
     - Si el usuario no está autenticado:
       - Muestra un enlace "Iniciar sesión" que apunta a `Auth/Login`.

5) Agregar parcial al diseño:
   - Actualice `Pages/Shared/_Layout.cshtml` para incluir:
     - `<partial name="_LoginPartial" />` en el área de la barra de navegación, preferiblemente alineado con el lado derecho de la barra de navegación.
   - No elimine el contenido del diseño existente.

6) Comportamiento de la página de inicio (para visualización de claims):
   - Si MODE = "NEW_APP", o si la página de inicio existente está efectivamente vacía (solo texto repetitivo o sin contenido significativo):
     - Implemente una página de inicio sencilla que:
       - Da la bienvenida al usuario.
       - Si el usuario está autenticado, muestra una lista o tabla de claims del usuario (tipo y valor).
       - Si el usuario no está autenticado, muestra un mensaje como "No has iniciado sesión" y una sugerencia para hacer clic en el enlace de inicio de sesión.
   - Si MODE = "EXISTING_APP" y la página de inicio ya tiene contenido significativo:
     - No modifique la página de inicio existente para agregar visualización de claims.
     - Deje intacto el contenido de la página de inicio existente.

### Expectativas de producción

1) Cambios de código y archivo:
   - Enumere todos los archivos creados o modificados.
   - Para cada archivo, genere el contenido completo del archivo (o una diferencia muy clara si el archivo es grande).
   - Asegúrese de que el proyecto pueda compilarse y ejecutarse con `dotnet run` (o el comando habitual para el marco de destino elegido).

2) Ubicación y orientación de la configuración:
   - Muestre claramente exactamente dónde se leen los valores de configuración Authority, ClientId y ClientSecret en el código (sección IdentitySettings).
   - Explique al usuario:
     - Que deben establecer estos valores después de generar el código.
     - Cómo configurar Authority y ClientId en appsettings.json.
     - Cómo configurar ClientSecret en secretos de usuario localmente o una variable de entorno o un almacén secreto seguro en producción.

3) Información del punto final de la aplicación:
   - En su respuesta final al usuario, indique explícitamente:
     - La URL del punto final local en la que escucha la aplicación (por ejemplo: `{{APP_BASE_URL}}` o la URL que utiliza la plantilla).
     - Una instrucción breve y clara que le dice al usuario:
       - "Configure su FoxIDs Authority y ClientId en la sección IdentitySettings. Guarde ClientSecret en secretos de usuario localmente o en una variable de entorno o un almacén secreto seguro en producción, para que pueda leerse en tiempo de ejecución sin comprometerse".

4) Barandillas:
   - No introduzca refactorizaciones no relacionadas.
   - No elimine ninguna característica existente más allá de lo estrictamente necesario para integrar OIDC con FoxIDs.
   - Mantenga la solución enfocada en:
     - Agregar cookie + autenticación OIDC,
     - AuthController,
     - Iniciar sesión parcial,
     - Cambios mínimos en la página de inicio como se describe.

Ahora implemente todo lo anterior.

La respuesta de AI debería indicarle dónde configurar Authority, ID de cliente y secreto de cliente.

Ahora intente ejecutar la aplicación para encontrar el punto final.

Mi aplicación de muestra se ejecuta localmente en https://localhost:7154/

Aplicación principal ASP.NET generada por IA con OpenID Connect

Puede encontrar el código de muestra generado por IA en: https://github.com/ITfoxtec/dotnet.samples/tree/main/WebAppPasswordLessEmailAI

Configurar la aplicación web en FoxIDs

Ahora que conocemos la dirección local de la aplicación web, podemos registrarla en FoxIDs para que pueda autenticar a los usuarios a través de OpenID Connect.

  1. Seleccione la pestaña Aplicaciones en su entorno FoxIDs.
  2. Elija Nueva aplicación y luego seleccione Aplicación web: OpenID Connect.
  3. En Nombre, ingrese un nombre, por ejemplo: Aplicación web ASP.NET.
  4. En el URI de redireccionamiento, agregue la dirección base de la aplicación: https://localhost:7154/ De forma predeterminada, FoxIDs permite redirigir a cualquier página posterior bajo esta URL base. Si prefiere una validación más estricta, puede solicitar URI de redireccionamiento absoluto.
  5. Haga clic en Crear.
Agregar aplicación en FoxIDs

FoxIDs ahora muestra los detalles de conexión para su nueva aplicación, que incluyen:

  • Authority
  • ID de cliente
  • Secreto del cliente
Aplicación creada en FoxIDs

Copie Authority y ID de cliente en la sección IdentitySettings del proyecto. Almacene el Client Secret en los secretos de usuario .NET localmente o en una variable de entorno segura o un almacén secreto en producción.

Configurar la autenticación en la aplicación ASP.NET

Con la aplicación FoxIDs creada, el siguiente paso es configurar la autenticación en el proyecto ASP.NET Core.

Agregue los detalles de conexión no secretos FoxIDs a appsettings.json:

{
  "IdentitySettings": {
    "Authority": "https://foxids.com/{tenant}/{environment}/{application}/",
    "ClientId": "your-client-id"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

Almacene el secreto del cliente localmente sin agregarlo a appsettings.json:

dotnet user-secrets init
dotnet user-secrets set "IdentitySettings:ClientSecret" "your-client-secret"

Reemplace los valores de ejemplo con aquellos de su propio entorno FoxIDs y nunca confirme el secreto del cliente real.

Acceso

Haga clic en Iniciar sesión y será redirigido a la pantalla de inicio de sesión FoxIDs.

Seleccione Crear usuario.

Pantalla de inicio de sesión FoxIDs

Complete el formulario Crear usuario con su correo electrónico (o un correo electrónico de prueba al que tenga acceso), nombre y apellido, luego haga clic en Crear.

Crear un usuario de prueba

Ingrese la contraseña de un solo uso (OTP) que recibió por correo electrónico y luego haga clic en Iniciar sesión.

Inicie sesión con contraseña de un solo uso (OTP)

Ha iniciado sesión y se muestran los claims de su usuario de prueba.

Iniciado sesión, mostrar claims

A continuación, intente cerrar sesión e iniciar sesión nuevamente para experimentar el flujo de inicio de sesión sin contraseña mediante el correo electrónico OTP.