Saltar al contenido principal

Usa IA para integrar Auth0

Si usas un asistente de programación con IA como Claude Code, Cursor o GitHub Copilot, puedes añadir la autenticación de Auth0 automáticamente en minutos con agent skills.Instala:
npx skills add auth0/agent-skills --skill auth0-quickstart --skill auth0-maui
Luego pídele a tu asistente de IA:
Add Auth0 authentication to my .NET MAUI app
Tu asistente de IA creará automáticamente tu aplicación de Auth0, obtendrá las credenciales, instalará el SDK Auth0 OidcClient MAUI, configurará las URL de devolución de llamada e implementará los flujos de Login y Logout. Documentación completa de agent skills →
Esta guía muestra cómo integrar Auth0 con una aplicación .NET MAUI mediante el SDK Auth0.OidcClient.MAUI. Al finalizar, tu aplicación admitirá Login, Logout y la visualización de la información del perfil de usuario en Android, iOS, macOS y Windows desde una única base de código. Esta guía usa la versión 1.x de Auth0.OidcClient.MAUI.

Requisitos previos

  • SDK de .NET 8 o .NET 9 instalado (descargar)
  • Carga de trabajo de MAUI instalada
  • Una cuenta de Auth0 (regístrate gratis)
  • Visual Studio 2022 (17.8+), JetBrains Rider o VS Code con la extensión de .NET MAUI
Verifica tu entorno:
dotnet --version        # Debe ser 8.x o 9.x
dotnet workload list    # Debe incluir maui
Si no tiene instalada la carga de trabajo de MAUI, instálela:
dotnet workload install maui

Primeros pasos

1

Configure la aplicación de Auth0

Configura tu aplicación de Auth0 para obtener las credenciales que necesita tu aplicación MAUI.
  1. Ve a Auth0 Dashboard > Applications > Applications
  2. Selecciona Create Application
  3. Escribe un nombre para tu aplicación (por ejemplo, “My MAUI App”), selecciona Native como tipo de aplicación y, a continuación, selecciona Create
  4. Ve a la pestaña Settings en la página Application Details
  5. Toma nota de los valores de Dominio e ID de cliente; los necesitarás más adelante
En la pestaña Settings, desplázate hasta Application URIs y configura las siguientes URL. Las aplicaciones .NET MAUI usan un esquema de URI personalizado (por ejemplo, myapp://callback) en lugar de una URL HTTP.Allowed Callback URLs:
myapp://callback
Allowed Logout URLs:
myapp://callback
Elija un esquema único para su aplicación. Un nombre de dominio invertido funciona bien; por ejemplo, com.mycompany.myapp://callback.
Seleccione Guardar cambios.
Tiene una aplicación nativa en Auth0 con el dominio y el ID de cliente anotados, y las URL de callback y de cierre de sesión configuradas.
2

Crea tu proyecto MAUI

Si ya tiene un proyecto de .NET MAUI, vaya al paso 3. De lo contrario, cree uno con la CLI de .NET:
dotnet new maui -n MyMauiApp
cd MyMauiApp
3

Instalar el SDK de Auth0 para MAUI

Agrega el paquete NuGet Auth0.OidcClient.MAUI a tu proyecto:
dotnet add package Auth0.OidcClient.MAUI
Ejecuta dotnet restore para confirmar que el paquete se haya instalado sin errores.
4

Configurar el manejo del callback específico para cada plataforma

Las aplicaciones .NET MAUI deben registrar un controlador de callback en cada plataforma para que el navegador del sistema pueda redirigir a la aplicación después de la autenticación. Siga las instrucciones correspondientes a cada plataforma de destino.
Cree un archivo en Platforms/Android/WebAuthenticatorActivity.cs:
Platforms/Android/WebAuthenticatorActivity.cs
using Android.App;
using Android.Content;
using Android.Content.PM;

namespace MyMauiApp.Platforms.Android;

[Activity(NoHistory = true, LaunchMode = LaunchMode.SingleTop, Exported = true)]
[IntentFilter(new[] { Intent.ActionView },
              Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
              DataScheme = CALLBACK_SCHEME)]
public class WebAuthenticatorActivity : Microsoft.Maui.Authentication.WebAuthenticatorCallbackActivity
{
    const string CALLBACK_SCHEME = "myapp";
}
Reemplace myapp por el esquema de URI que configuró en el paso 1.
El valor de CALLBACK_SCHEME debe coincidir exactamente con el esquema de su RedirectUri y con Allowed Callback URLs en Auth0.
5

Añadir login y logout

Debes crear o modificar tres archivos: un ViewModel con la lógica de inicio y cierre de sesión, una página XAML para la interfaz de usuario y un archivo de code-behind para conectarlos.
Crea el ViewModel en ViewModels/MainPageViewModel.cs:
ViewModels/MainPageViewModel.cs
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Input;
using Auth0.OidcClient;

namespace MyMauiApp.ViewModels;

public class MainPageViewModel : INotifyPropertyChanged
{
    private readonly Auth0Client _client;
    private string _name;
    private string _email;
    private bool _isAuthenticated;

    public event PropertyChangedEventHandler PropertyChanged;

    public string Name
    {
        get => _name;
        set { _name = value; OnPropertyChanged(); }
    }

    public string Email
    {
        get => _email;
        set { _email = value; OnPropertyChanged(); }
    }

    public bool IsAuthenticated
    {
        get => _isAuthenticated;
        set
        {
            _isAuthenticated = value;
            OnPropertyChanged();
            OnPropertyChanged(nameof(IsNotAuthenticated));
        }
    }

    public bool IsNotAuthenticated => !IsAuthenticated;

    public ICommand LoginCommand { get; }
    public ICommand LogoutCommand { get; }

    public MainPageViewModel(Auth0Client client)
    {
        _client = client;
        LoginCommand = new Command(async () => await LoginAsync());
        LogoutCommand = new Command(async () => await LogoutAsync());
    }

    private async Task LoginAsync()
    {
        var loginResult = await _client.LoginAsync();

        if (loginResult.IsError)
        {
            if (loginResult.Error == "UserCancel")
                return; // El usuario cerró el navegador; no es un error

            await Shell.Current.DisplayAlert("Error de inicio de sesión", loginResult.Error, "Aceptar");
            return;
        }

        // Lee las claim del perfil de usuario desde el ID Token
        Name = loginResult.User.FindFirst(c => c.Type == "name")?.Value;
        Email = loginResult.User.FindFirst(c => c.Type == "email")?.Value;
        IsAuthenticated = true;
    }

    private async Task LogoutAsync()
    {
        await _client.LogoutAsync();

        Name = null;
        Email = null;
        IsAuthenticated = false;
    }

    private void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
Tu proyecto ahora tiene un ViewModel con comandos para iniciar y cerrar sesión, una página XAML con enlace de datos y el code-behind conectado.
6

Registrar los servicios e instanciar el cliente de Auth0

Ahora registra Auth0Client, el ViewModel y la página mediante inyección de dependencias en MauiProgram.cs. Esto enlaza todo para que el cliente de Auth0 se inyecte en el ViewModel y el ViewModel se inyecte en la página:
MauiProgram.cs
using Auth0.OidcClient;
using MyMauiApp.ViewModels;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
            });

        // Configura el cliente Auth0 con tus credenciales del Paso 1
        builder.Services.AddSingleton(new Auth0Client(new Auth0ClientOptions
        {
            Domain = "{yourDomain}",
            ClientId = "{yourClientId}",
            RedirectUri = "myapp://callback",
            PostLogoutRedirectUri = "myapp://callback"
        }));

        // Registra la página y el ViewModel creados en el Paso 5
        builder.Services.AddTransient<MainPage>();
        builder.Services.AddTransient<MainPageViewModel>();

        return builder.Build();
    }
}
Sustituye {yourDomain} y {yourClientId} por los valores de la configuración de tu aplicación de Auth0 (paso 1). RedirectUri y PostLogoutRedirectUri son obligatorios para las aplicaciones MAUI. Usa la misma URL de devolución de llamada que introdujiste en el Auth0 Dashboard.
7

Ejecute la aplicación

Compila y ejecuta tu aplicación de .NET MAUIFlujo esperado:
  1. La aplicación se inicia y muestra el botón Iniciar sesión
  2. Toca Iniciar sesión → se abre el navegador del sistema con Universal Login de Auth0
  3. Completa la autenticación (regístrate o inicia sesión)
  4. El navegador redirige de nuevo a tu aplicación
  5. La aplicación muestra tu nombre y correo electrónico con un botón Cerrar sesión
Ahora tiene una experiencia de Login de Auth0 plenamente funcional en su aplicación .NET MAUI.

Solución de problemas

Síntoma: El navegador muestra “Callback URL mismatch. The provided redirect_uri is not in the list of allowed callback URLs.”Solución:
  1. Confirme que el ID de cliente en su código coincida con la aplicación que configuró en el Auth0 Dashboard
  2. Borre el campo Allowed Callback URLs y vuelva a escribir myapp://callback manualmente; al copiar y pegar suelen introducirse espacios finales o saltos de línea invisibles
  3. Asegúrese de que la coincidencia sea exacta: sin barra diagonal final, solo en minúsculas y sin espacios en blanco
  4. Seleccione Save Changes en el Dashboard y verifique que el valor se haya guardado
  5. Revise la barra de direcciones del navegador para ver el parámetro de consulta redirect_uri y comprobar qué está enviando realmente su aplicación
Síntoma: El navegador se abre para iniciar sesión, pero nunca redirige de vuelta a la aplicación.Solución:
  1. Verifique que DataScheme en WebAuthenticatorActivity.cs coincida con el esquema de su RedirectUri
  2. Asegúrese de que la Activity tenga Exported = true
  3. Confirme que Allowed Callback URLs en Auth0 Dashboard coincidan exactamente
Síntoma: El navegador se abre, pero en lugar de reanudar la aplicación se abre una segunda instancia.Solución: Asegúrese de que Auth0.OidcClient.Platforms.Windows.Activator.Default.CheckRedirectionActivation() se llame como la primera línea del constructor de App en Platforms/Windows/App.xaml.cs, y de que el nombre del protocolo en Package.appxmanifest coincida con el esquema de su URI de callback.
Síntoma: Después de iniciar sesión, el navegador muestra un error o no ocurre nada; la aplicación nunca recibe el callback.Solución: Su aplicación debe ser una aplicación empaquetada (MSIX). Revise su archivo .csproj para comprobar si contiene un elemento <WindowsPackageType>:
  • Si está establecido en None, la activación del protocolo no está disponible. Elimine la línea o cámbiela por <WindowsPackageType>MSIX</WindowsPackageType>.
  • Si el elemento no está presente, su aplicación ya está empaquetada de forma predeterminada; verifique que Package.appxmanifest contenga la extensión <uap:Protocol> del paso 4.
Síntoma: Los claims name, email o picture no aparecen en loginResult.User.Solución: Verifique que openid profile email estén incluidos en Auth0ClientOptions.Scope. Si ha personalizado el scope, asegúrese de que openid esté siempre presente.

Próximos pasos

Ahora tienes una integración de Auth0 funcional en tu aplicación .NET MAUI. Explora estos temas para ampliar tu implementación:
El SDK de Auth0 para MAUI admite tokens de actualización para renovar sesiones de forma silenciosa sin volver a pedir intervención al usuario.

Habilitar tokens de actualización

Agrega offline_access a la propiedad Scope:
builder.Services.AddSingleton(new Auth0Client(new Auth0ClientOptions
{
    Domain = "{yourDomain}",
    ClientId = "{yourClientId}",
    RedirectUri = "myapp://callback",
    PostLogoutRedirectUri = "myapp://callback",
    Scope = "openid profile email offline_access"
}));

Usar tokens de actualización

Después de iniciar sesión, almacena el token de actualización y úsalo para renovar la sesión de forma silenciosa:
// Después de iniciar sesión
var refreshToken = loginResult.RefreshToken;

// Más tarde, renueva la sesión
var refreshResult = await _client.RefreshTokenAsync(refreshToken);

if (!refreshResult.IsError)
{
    var newAccessToken = refreshResult.AccessToken;
    var newIdToken = refreshResult.IdentityToken;
}
Si RefreshToken es null después de iniciar sesión, asegúrate de que Allow Offline Access esté habilitado en la configuración de tu API en el Auth0 Dashboard (cuando uses un parámetro audience).
Para obtener un token de acceso para tu API, establece Scope y pasa un parámetro audience a LoginAsync():
var loginResult = await _client.LoginAsync(new
{
    audience = "https://myapi.example.com"
});

// El token de acceso ahora es para tu API
var accessToken = loginResult.AccessToken;

var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization =
    new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken);

var response = await httpClient.GetAsync("https://myapi.example.com/posts");
Autentica a los usuarios dentro de una Organización de Auth0 específica:
var loginResult = await _client.LoginAsync(new
{
    organization = "org_abc123"
});
Para obtener más información, consulta Organizaciones.
Usa MaxAge para forzar la reautenticación después de un tiempo determinado:
new Auth0ClientOptions
{
    Domain = "{yourDomain}",
    ClientId = "{yourClientId}",
    RedirectUri = "myapp://callback",
    PostLogoutRedirectUri = "myapp://callback",
    MaxAge = TimeSpan.FromMinutes(30)
}
Adapta la página de inicio de sesión de Auth0 para que coincida con tu marca, incluidos los colores, los logotipos y el texto.Para obtener más información, consulta Personalizar Universal Login.

Recursos adicionales

Repositorio del SDK

Código fuente, ejemplos y referencia de API

Prácticas recomendadas para tokens

Prácticas recomendadas de seguridad para los tokens

Flujo con PKCE

Cómo se autentican de forma segura las aplicaciones nativas

Foro de la comunidad de Auth0

Obtén ayuda de la comunidad de Auth0