ASP.NET Core 中的 Facebook、Google 及外部提供者驗證

作者:Valeriy NovytskyyRick Anderson

本教學課程會示範如何建置 ASP.NET Core 應用程式,讓使用者可使用 OAuth 2.0 以外部驗證提供者提供的認證登入。

FacebookTwitterGoogleMicrosoft 提供者的說明請見下列各節,並使用本文建立的入門專案。 您可透過 AspNet.Security.OAuth.ProvidersAspNet.Security.OpenId.Providers 這類協力廠商套件,取得其他提供者。

讓使用者透過現有認證登入:

  • 對使用者而言十分方便。
  • 可將複雜的登入程序管理作業轉移至協力廠商。

建立新的 ASP.NET Core 專案

  • 選取 [ASP.NET Core Web 應用程式] 範本。 選取 [確定]。
  • 在 [驗證類型] 輸入中,選取 [個別帳戶]。

套用移轉

  • 執行應用程式並選取 [登錄] 連結。
  • 輸入新帳戶的電子郵件和密碼,然後選取 [註冊]
  • 遵循指示以套用移轉。

使用 Proxy 或負載平衡器轉送要求資訊

如果將應用程式部署於 Proxy 伺服器或負載平衡器後方,可能就會在要求標頭中將一些原始要求資訊轉送到應用程式。 此資訊通常會包括安全要求配置 (https)、主機和用戶端 IP 位址。 應用程式不會自動讀取這些要求標頭來探索並使用原始要求資訊。

此配置可用於產生連結,其會對使用外部提供者的驗證流程產生影響。 遺失安全配置 (https) 會導致應用程式產生不正確且不安全的重新導向 URL。

使用轉送標頭中介軟體,使應用程式能夠使用原始要求資訊來處理要求。

如需詳細資訊,請參閱設定 ASP.NET Core 以處理 Proxy 伺服器和負載平衡器

使用 SecretManager 來儲存登入提供者指派的權杖

社交登入提供者會在註冊程序期間指派應用程式識別碼應用程式密碼權杖。 確切權杖名稱會依提供者而有所不同。 這些權杖代表您的應用程式用來存取其 API 的認證。 這些權杖會組成「使用者祕密」,在祕密管理員的協助下連結到您的應用程式設定。 相較於在設定檔 (例如 appsettings.json) 中儲存權杖,使用者祕密是較安全的替代方案。

重要

祕密管理員僅供用於開發用途。 您可以透過 Azure Key Vault 設定提供者儲存及保護 Azure 測試與生產祕密。

請遵循 Safe storage of app secrets in development in ASP.NET Core (在 ASP.NET Core 開發過程中安全地儲存應用程式祕密) 主題中的步驟,儲存下方各個登入提供者指派的權杖。

設定應用程式所需的登入提供者

若要將應用程式設定為使用相應的提供者,請使用下列主題:

多個驗證提供者

當應用程式需要多個提供者時,請從 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();

選擇性地設定密碼

當您使用外部登入提供者註冊時,您並未向應用程式註冊密碼。 這樣可以減輕您建立網站密碼與記住密碼的壓力,但這也會讓您依賴外部登入提供者。 如果無法使用外部登入提供者,您就無法登入網站。

若要建立密碼,並使用您在外部提供者登入程序期間所設的電子郵件進行登入:

  • 選取右上角的 [Hello <電子郵件別名>] 連結以瀏覽至 [管理] 檢視。

Web application Manage view

  • 選取 [建立]

Set your password page

  • 設定有效的密碼,以便使用此密碼與電子郵件進行登入。

其他資訊