Autenticación con Facebook, Google y proveedores externos en ASP.NET Core

Por Valeriy Novytskyy y Rick Anderson

En este tutorial se muestra cómo crear una aplicación de ASP.NET Core que permita a los usuarios iniciar sesión mediante OAuth 2.0 con credenciales de proveedores de autenticación externos.

En las siguientes secciones se tratan los proveedores Facebook, Twitter, Google y Microsoft, y usan el proyecto inicial creado en este artículo. Hay disponibles otros proveedores en paquetes de terceros como OpenIddict, AspNet.Security.OAuth.Providers y AspNet.Security.OpenId.Providers.

El hecho de permitir a los usuarios iniciar sesión con sus credenciales:

  • resulta muy práctico para ellos;
  • transfiere muchas de las complejidades de administrar el proceso de inicio de sesión a un tercero.

Crear un proyecto de ASP.NET Core

  • Seleccione la plantilla Aplicación web ASP.NET Core. Seleccione Aceptar.
  • En la entrada Tipo de autenticación, seleccione Cuentas individuales.

Aplicación de migraciones

  • Ejecute la aplicación y seleccione el vínculo Registrar.
  • Escriba el correo electrónico y la contraseña de la cuenta nueva y, luego, seleccione Registrarse.
  • Siga estas instrucciones para aplicar las migraciones.

Reenvío de información de solicitud con un servidor proxy o un equilibrador de carga

Si la aplicación se implementa detrás de un servidor proxy o de un equilibrador de carga, parte de la información de solicitud original podría reenviarse a la aplicación en los encabezados de solicitud. Normalmente, esta información incluye el esquema de solicitud seguro (https), el host y la dirección IP del cliente. Las aplicaciones no leen automáticamente estos encabezados de solicitud para detectar y usar la información de solicitud original.

El esquema se usa en la generación de vínculos que afecta al flujo de autenticación con proveedores externos. El resultado de perder el esquema seguro (https) es que la aplicación genera direcciones URL incorrectas poco seguras.

Use middleware de encabezados reenviados para que la información de solicitud original esté disponible para la aplicación para procesar las solicitudes.

Para más información, vea Configurar ASP.NET Core para trabajar con servidores proxy y equilibradores de carga.

Uso de SecretManager para almacenar los tokens asignados por los proveedores de inicio de sesión

Los proveedores de inicio de sesión de las redes sociales asignan los tokens Id. de aplicación y Secreto de la aplicación durante el proceso de registro. La nomenclatura puede variar en función del proveedor. Estos tokens representan las credenciales que usa la aplicación para acceder a su API. Los tokens constituyen los "secretos de usuario" que se pueden vincular a la configuración de la aplicación con la ayuda del Administrador de secretos. Los secretos de usuario son una alternativa más segura al almacenamiento de los tokens en un archivo de configuración, como, por ejemplo, appsettings.json.

Importante

Secret Manager solo está pensado para fines de desarrollo. Puede almacenar y proteger sus secretos de producción y pruebas de Azure con el proveedor de configuración de Azure Key Vault.

Siga los pasos descritos en el tema Ubicación de almacenamiento segura de secretos de la aplicación en el desarrollo de ASP.NET Core para almacenar los tokens asignados por cada uno de los siguientes proveedores de inicio de sesión.

Configuración de los proveedores de inicio de sesión requeridos por la aplicación

En los temas siguientes encontrará información para configurar la aplicación a fin de usar los proveedores correspondientes:

Varios proveedores de autenticación

Cuando la aplicación requiera varios proveedores, encadene los métodos de extensión del proveedor de AddAuthentication:

using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebApplication16.Data;

var builder = WebApplication.CreateBuilder(args);
var config = builder.Configuration;

var connectionString = config.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options =>
                                 options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddAuthentication()
   .AddGoogle(options =>
   {
       IConfigurationSection googleAuthNSection =
       config.GetSection("Authentication:Google");
       options.ClientId = googleAuthNSection["ClientId"];
       options.ClientSecret = googleAuthNSection["ClientSecret"];
   })
   .AddFacebook(options =>
   {
       IConfigurationSection FBAuthNSection =
       config.GetSection("Authentication:FB");
       options.ClientId = FBAuthNSection["ClientId"];
       options.ClientSecret = FBAuthNSection["ClientSecret"];
   })
   .AddMicrosoftAccount(microsoftOptions =>
   {
       microsoftOptions.ClientId = config["Authentication:Microsoft:ClientId"];
       microsoftOptions.ClientSecret = config["Authentication:Microsoft:ClientSecret"];
   })
   .AddTwitter(twitterOptions =>
   {
       twitterOptions.ConsumerKey = config["Authentication:Twitter:ConsumerAPIKey"];
       twitterOptions.ConsumerSecret = config["Authentication:Twitter:ConsumerSecret"];
       twitterOptions.RetrieveUserDetails = true;
   });

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapRazorPages();
app.MapDefaultControllerRoute();

app.Run();

Establecimiento opcional de contraseña

Si el registro se realiza mediante un proveedor de inicio de sesión externo, no se tiene ninguna contraseña en la aplicación. De esta forma no hace falta crear y recordar una contraseña para el sitio, aunque le hace depender del proveedor de inicio de sesión externo. Si el proveedor de inicio de sesión externo no está disponible, no podrá iniciar sesión en el sitio web.

Para crear una contraseña e iniciar sesión con el correo electrónico establecido durante el proceso de inicio de sesión con proveedores externos:

  • Seleccione el vínculo Hola, <alias de correo electrónico> situado en la esquina superior derecha para ir a la vista Administración.

Vista Administración de la aplicación web

  • Seleccione Crear

Página para establecer la contraseña

  • Establezca una contraseña válida. Podrá usarla para iniciar sesión con su correo electrónico.

Información adicional