Autenticazione dei provider Facebook, Google ed esterni in ASP.NET Core

Da Valeriy Novytskyy e Rick Anderson

Questa esercitazione illustra come compilare un'app ASP.NET Core che consente agli utenti di eseguire l'accesso tramite OAuth 2.0 con credenziali di provider di autenticazione esterni.

Nelle sezioni seguenti vengono descritti i provider Facebook, Twitter, Google e Microsoft, usando il progetto iniziale creato in questo articolo. Altri provider sono disponibili nei pacchetti di terze parti, ad esempio AspNet.Security.OAuth.Providers e AspNet.Security.OpenId.Providers.

Il fatto di consentire agli utenti l'accesso con le proprie credenziali esistenti:

  • È pratico per gli utenti.
  • Trasferisce a terzi molti aspetti complicati del processo di accesso.

Creare un nuovo progetto ASP.NET Core

  • Selezionare il modello App Web ASP.NET Core. Seleziona OK.
  • Nell'input Tipo di autenticazione selezionare Account singoli.

Applicare le migrazioni

  • Eseguire l'app e selezionare il collegamento Registra.
  • Immettere l'indirizzo di posta elettronica e la password per il nuovo account, quindi selezionare Registra.
  • Seguire le istruzioni per applicare le migrazioni.

Inoltrare informazioni della richiesta con un proxy o un servizio di bilanciamento del carico

Se l'app viene distribuita dietro un server proxy o un servizio di bilanciamento del carico, alcune delle informazioni della richiesta originale possono essere inoltrate all'app nelle intestazioni della richiesta. Queste informazioni includono in genere lo schema della richiesta sicura (https), l'host e l'indirizzo IP del client. Le app non leggono automaticamente queste intestazioni della richiesta per individuare e usare le informazioni della richiesta originale.

Lo schema viene usato nella generazione di collegamenti che influisce sul flusso di autenticazione con provider esterni. La perdita dello schema sicuro (https) fa sì che l'app generi URL di reindirizzamento non sicuri e non corretti.

Usare il middleware delle intestazioni inoltrate per rendere disponibili per l'app le informazioni della richiesta originale per l'elaborazione delle richieste.

Per altre informazioni, vedere Configurare ASP.NET Core per l'utilizzo di server proxy e servizi di bilanciamento del carico.

Usare SecretManager per archiviare i token assegnati dai provider di accesso

I provider di accesso ai social assegnano i token ID applicazione e Segreto dell'applicazione durante il processo di registrazione. La denominazione esatta dei token varia a seconda del provider. Questi token rappresentano le credenziali usate dall'app per accedere alle API. I token costituiscono i "segreti 'utente" che è possibile collegare alla configurazione dell'app usando Secret Manager. I segreti utente rappresentano un'alternativa più sicura all'archiviazione dei token in un file di configurazione, ad esempio appsettings.json.

Importante

Secret Manager è progettato esclusivamente per lo sviluppo. È possibile memorizzare e proteggere i segreti relativi al test e alla produzione di Azure usando il provider di configurazione di Azure Key Vault.

Seguire la procedura descritta nell'argomento Archiviazione sicura di segreti dell'app durante lo sviluppo di ASP.NET Core per archiviare i token assegnati dai singoli provider di accesso elencati di seguito.

Impostare i provider di accesso necessari per l'applicazione

Usare gli argomenti seguenti per configurare l'applicazione per usare i rispettivi provider:

Più provider di autenticazione

Se l'app richiede più provider, concatenare i metodi di estensione del provider in 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();

Impostare facoltativamente la password

Quando ci si registra con un provider di accesso esterno, non si dispone di una password registrata con l'app. Questo evita la creazione e la memorizzazione di una password per il sito, ma crea anche una dipendenza dal provider di accesso esterno. Se il provider di accesso esterno non è disponibile, non si potrà accedere al sito web.

Per creare una password e accedere usando la posta elettronica impostata durante il processo di accesso con provider esterni:

  • Selezionare il collegamento Salve <alias di posta elettronica> nell'angolo superiore destro per passare alla vista Gestione.

Web application Manage view

  • Selezionare Crea.

Set your password page

  • Impostare una password valida in modo da usarla per accedere con la posta elettronica.

Informazioni aggiuntive