Uwierzytelnianie przy użyciu usług Facebook, Google i dostawców zewnętrznych na platformie ASP.NET Core

Autorzy: Valeriy Novytskyy i Rick Anderson

W tym samouczku pokazano, jak utworzyć aplikację platformy ASP.NET Core, która umożliwia użytkownikom logowanie się przy użyciu protokołu OAuth 2.0 za pomocą poświadczeń od zewnętrznych dostawców uwierzytelniania.

Dostawcy usług Facebook, Twitter, Google i Microsoft są omówieni w kolejnych sekcjach, z użyciem projektu początkowego utworzonego w tym artykule. Inni dostawcy są dostępni w pakietach innych firm, takich jak OpenIddict, AspNet.Security.OAuth.Providers i AspNet.Security.OpenId.Providers.

Umożliwienie użytkownikom logowania się przy użyciu istniejących poświadczeń:

  • Jest wygodne dla użytkowników.
  • Przenosi wiele złożoności zarządzania procesem logowania do innej firmy.

Tworzenie nowego projektu platformy ASP.NET Core

  • Wybierz szablon aplikacji internetowej ASP.NET Core. Wybierz przycisk OK.
  • W polu Dane wejściowe typu uwierzytelniania wybierz pozycję Indywidualne konta.

Stosowanie migracji

  • Uruchom aplikację i wybierz link Zarejestruj się.
  • Wprowadź adres e-mail i hasło dla nowego konta, a następnie wybierz pozycję Zarejestruj się.
  • Postępuj zgodnie z instrukcjami, aby zastosować migracje.

Przekazywanie dalej informacji o żądaniu za pomocą serwera proxy lub modułu równoważenia obciążenia

Jeśli aplikacja jest wdrażana za serwerem proxy lub modułem równoważenia obciążenia, niektóre z pierwotnych informacji o żądaniu mogą zostać przekazane dalej do aplikacji w nagłówkach żądania. Te informacje zazwyczaj obejmują bezpieczny schemat żądań (https), hosta i adres IP klienta. Aplikacje nie odczytują automatycznie tych nagłówków żądań, aby odnaleźć pierwotne informacje o żądaniu i z nich korzystać.

Schemat jest używany do generowania linków, które mają wpływ na przepływ uwierzytelniania przy użyciu zewnętrznych dostawców. W wyniku utraty bezpiecznego schematu (https) aplikacja generuje nieprawidłowe niezabezpieczone adresy URL przekierowania.

Użyj oprogramowania pośredniczącego przekazanych nagłówków, aby udostępnić pierwotne informacje o żądaniu do aplikacji w celu przetworzenia żądania.

Aby uzyskać więcej informacji, zobacz Konfigurowanie platformy ASP.NET Core pod kątem pracy z serwerami proxy i modułami równoważenia obciążenia.

Korzystanie z Menedżera wpisów tajnych w celu przechowywania tokenów przypisanych przez dostawców logowania

Dostawcy logowania mediów społecznościowych przypisują tokeny identyfikatora aplikacji oraz wpisów tajnych aplikacji podczas procesu rejestracji. Dokładne nazwy tokenów różnią się w zależności od dostawcy. Te tokeny reprezentują poświadczenia używane przez aplikację do uzyskiwania dostępu do interfejsu API. Tokeny stanowią „wpisy tajne użytkownika”, które można połączyć z konfiguracją aplikacji za pomocą Menedżera wpisów tajnych. Wpisy tajne użytkownika są bezpieczniejszą alternatywą dla przechowywania tokenów w pliku konfiguracji, na przykład appsettings.json.

Ważne

Menedżer wpisów tajnych jest przeznaczony tylko do celów programistycznych. Wpisy tajne testowania i produkcji platformy Azure można przechowywać i chronić za pomocą dostawcy konfiguracji usługi Azure Key Vault.

Wykonaj kroki opisane w temacie Bezpieczne przechowywanie tworzonych wpisów tajnych na platformie ASP.NET Core, aby przechowywać tokeny przypisane przez każdego dostawcę logowania poniżej.

Konfigurowanie dostawców logowania wymaganych przez aplikację

Zapoznaj się z następującymi tematami, aby skonfigurować aplikację pod kątem korzystania z odpowiednich dostawców:

Wielu dostawców uwierzytelniania

Jeśli aplikacja wymaga wielu dostawców, utwórz łańcuch metod rozszerzeń dostawców na podstawie metody 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();

Opcjonalne ustawianie hasła

Podczas rejestrowania się za pomocą zewnętrznego dostawcy logowania nie masz hasła zarejestrowanego w aplikacji. To pozwala Ci uniknąć tworzenia i zapamiętywania hasła dla tej witryny, ale również uzależnia Cię od zewnętrznego dostawcy logowania. Jeśli zewnętrzny dostawca logowania jest niedostępny, nie będziesz mieć możliwości zalogowania się do witryny internetowej.

Aby utworzyć hasło i zalogować się za pomocą adresu e-mail ustawionego podczas procesu logowania przy użyciu zewnętrznych dostawców:

  • Wybierz link Witaj, <alias e-mail> w prawym górnym rogu, aby przejść do widoku Zarządzaj.

Widok Zarządzaj w aplikacji internetowej

  • Wybierz pozycję Utwórz

Strona ustawiania hasła

  • Ustaw prawidłowe hasło, którego możesz użyć do zalogowania się przy użyciu adresu e-mail.

Dodatkowe informacje