Authentification à l’aide de fournisseurs externes (Facebook, Google et autres) dans ASP.NET Core

Par Valeriy Novytskyy et Rick Anderson

Ce tutoriel montre comment créer une application ASP.NET Core qui permet aux utilisateurs de se connecter en utilisant OAuth 2.0 avec des informations d’identification provenant de fournisseurs d’authentification externes.

Les fournisseurs Facebook, Twitter, Google et Microsoft sont couverts dans les sections suivantes et utilisent le projet de démarrage créé dans cet article. D’autres fournisseurs sont disponibles dans des packages tiers, comme OpenIddict, AspNet.Security.OAuth.Providers et AspNet.Security.OpenId.Providers.

Permettre aux utilisateurs de se connecter avec leurs informations d’identification existantes :

  • Est pratique pour les utilisateurs.
  • Transfère une grande partie des complexités de la gestion du processus de connexion à un tiers.

Créer un projet ASP.NET Core

  • Sélectionnez le modèle Application web ASP.NET Core. Cliquez sur OK.
  • Dans l’entrée Type d’authentification, sélectionnez Comptes individuels.

Appliquer des migrations

  • Exécutez l’application et sélectionnez le lien S’inscrire.
  • Entrez l’adresse e-mail et le mot de passe du nouveau compte, puis sélectionnez S’inscrire.
  • Suivez les instructions pour appliquer des migrations.

Transférer les informations sur la demande avec un proxy ou un équilibreur de charge

Si l’application est déployée derrière un serveur proxy ou un équilibreur de charge, certaines informations sur la demande d’origine peuvent être transférées vers l’application dans les en-têtes de demande. Ces informations incluent généralement le schéma de demande sécurisé (https), l’hôte et l’adresse IP du client. Les applications ne lisent pas automatiquement ces en-têtes de demande pour découvrir et d’utiliser les informations sur la demande d’origine.

Le schéma est utilisé dans la génération de lien qui affecte le flux d’authentification dans le cas de fournisseurs externes. En cas de perte du schéma sécurisé (https), l’application génère des URL de redirection incorrectes et non sécurisées.

Utilisez l’intergiciel Forwarded Headers afin de mettre les informations de demande d’origine à la disposition de l’application pour le traitement des demandes.

Pour plus d’informations, consultez l’article Configurer ASP.NET Core pour l’utilisation de serveurs proxy et d’équilibreurs de charge.

Utilisez SecretManager pour stocker les jetons affectés par les fournisseurs de connexion

Les fournisseurs de connexion de réseaux sociaux affectent des jetons ID d’application et Secret de l’application lors du processus d’inscription. Les noms de jeton exacts varient selon le fournisseur. Ces jetons représentent les informations d’identification que votre application utilise pour accéder à son API. Les jetons constituent les « secrets utilisateur » qui peuvent être liés à la configuration de votre application à l’aide de Secret Manager. Les secrets utilisateur sont une alternative plus sûre au stockage des jetons dans un fichier de configuration, comme appsettings.json.

Important

Secret Manager est uniquement réservé au développement. Vous pouvez stocker et protéger les secrets de test et de production Azure avec le fournisseur de configuration Azure Key Vault.

Suivez les étapes de la rubrique Stockage sécurisé des secrets d’application lors du développement dans ASP.NET Core pour stocker les jetons affectés par chaque fournisseur de connexion ci-dessous.

Configurer les fournisseurs de connexion nécessaires à votre application

Utilisez les rubriques suivantes pour configurer votre application pour utiliser ces différents fournisseurs :

Fournisseurs d’authentification multiple

Quand l’application nécessite plusieurs fournisseurs, chaînez les méthodes d’extension de fournisseur depuis 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();

Définition facultative d’un mot de passe

Quand vous vous inscrivez auprès d’un fournisseur de connexion externe, vous n’avez pas de mot de passe inscrit auprès de l’application. Ceci vous évite de devoir créer et mémoriser un mot de passe pour le site, mais vous rend aussi dépendant du fournisseur de connexion externe. Si le fournisseur de connexion externe n’est pas disponible, vous ne pouvez pas vous connecter au site web.

Pour créer un mot de passe et vous connecter à l’aide de l’e-mail que vous avez défini lors du processus de connexion avec des fournisseurs externes :

  • Sélectionnez le lien Bonjour <alias d’e-mail> en haut à droite pour accéder à la vue Gérer.

Vue Gérer de l’application web

  • Sélectionnez Créer

Page Définir votre mot de passe

  • Définissez un mot de passe valide à utiliser pour vous connecter avec votre e-mail.

Informations supplémentaires