ASP.NET Core 中的 Facebook 外部登入設定

作者:Valeriy NovytskyyRick Anderson

本教學課程的程式碼範例示範如何使用在上一頁建立的範例 ASP.NET Core 專案,讓使用者能使用其 Facebook 帳戶登入。 我們一開始會遵循官方步驟來建立 Facebook 應用程式識別碼。

在 Facebook 中建立應用程式

  • Microsoft.AspNetCore.Authentication.Facebook NuGet 套件新增至專案。

  • 瀏覽至 Facebook 開發人員應用程式頁面並登入。 如果您還沒有 Facebook 帳戶,請使用登入頁面上的 [註冊 Facebook] 連結加以建立。 擁有 Facebook 帳戶後,請依照指示註冊為 Facebook 開發人員。

  • 從 [我的應用程式] 功能表,選取 [建立應用程式]。 [建立應用程式] 表單隨即出現。 Facebook for developers portal open in Microsoft Edge

  • 選取最符合您專案的應用程式類型。 針對此專案,選取 [取用者],然後選取 [下一步]。 系統會建立新的應用程式識別碼。

  • 填寫表單,然後點選 [建立應用程式] 按鈕。

    Create a New App ID form

  • 在 [將產品新增至您的應用程式] 頁面上,選取 [Facebook 登入] 卡片上的 [設定]

    Product Setup page

  • [快速入門] 精靈會啟動並以 [選擇平台] 作為第一頁。 按一下左下方功能表中的 [FaceBook 登入] > [設定] 連結,暫時略過精靈:

    Skip Quick Start

  • [用戶端 OAuth 設定] 頁面隨即出現:

    Client OAuth Settings page

  • 在 [有效 OAuth 重新導向 URI] 欄位中輸入附加 /signin-facebook 的開發 URI (例如:https://localhost:44320/signin-facebook)。 本教學課程稍後設定的 Facebook 驗證會自動處理位於 /signin-facebook 路由的要求,以實作 OAuth 流程。

注意

URI /signin-facebook 會設定為 Facebook 驗證提供者的預設回呼。 您可以在透過 FacebookOptions 類別的繼承 RemoteAuthenticationOptions.CallbackPath 屬性來設定 Facebook 驗證中介軟體時,變更預設回呼 URI。

  • 選取儲存變更

  • 選取左側導覽中的 [設定]>[基本] 連結。

  • 記下您的 App IDApp Secret。 在下一節中,您會將這兩者新增至 ASP.NET Core 應用程式:

  • 部署網站時,您需要重新造訪 [Facebook 登入] 設定頁面,然後註冊新的公用 URI。

儲存 Facebook 應用程式識別碼和秘密

使用秘密管理員來儲存敏感性設定,例如 Facebook 應用程式識別碼和秘密值。 針對此範例,使用下列步驟:

  1. 依照啟用秘密儲存體的指示,初始化秘密儲存體的專案。

  2. 使用秘密金鑰 Authentication:Facebook:AppIdAuthentication:Facebook:AppSecret,將敏感性設定儲存在本機秘密存放區中:

    dotnet user-secrets set "Authentication:Facebook:AppId" "<app-id>"
    dotnet user-secrets set "Authentication:Facebook:AppSecret" "<app-secret>"
    

: 分隔符號不適用於所有平台上的環境變數階層式機碼。 __,雙底線,為:

  • 所有平台都支援。 例如,Bash 不支援 : 分隔符號,但支援 __
  • 自動由 : 取代

設定 Facebook 驗證

將驗證服務新增至 Startup.ConfigureServices

services.AddAuthentication().AddFacebook(facebookOptions =>
{
    facebookOptions.AppId = Configuration["Authentication:Facebook:AppId"];
    facebookOptions.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
});

將驗證服務新增至 Program

var builder = WebApplication.CreateBuilder(args);
var services = builder.Services;
var configuration = builder.Configuration;

services.AddAuthentication().AddFacebook(facebookOptions =>
    {
        facebookOptions.AppId = configuration["Authentication:Facebook:AppId"];
        facebookOptions.AppSecret = configuration["Authentication:Facebook:AppSecret"];
    });

AddAuthentication(IServiceCollection, String) 多載會設定 DefaultScheme 屬性。 AddAuthentication(IServiceCollection, Action<AuthenticationOptions>) 多載允許設定驗證選項,其可用於設定不同用途的預設驗證配置。 後續對 AddAuthentication 的呼叫會覆寫先前設定的 AuthenticationOptions 屬性。

每個驗證配置只能呼叫一次註冊驗證處理常式的 AuthenticationBuilder 擴充方法。 存在多載,允許設定配置屬性、配置名稱和顯示名稱。

以 Facebook 登入

  • 執行應用程式並選取 [登入]
  • 在 [使用其他服務進行登入。] 之下選取 Facebook。
  • 系統會將您重新導向至 Facebook 進行驗證。
  • 輸入您的 Facebook 認證。
  • 系統會將您重新導向回您可設定電子郵件的網站。

您現在已使用 Facebook 認證登入:

回應取消授權外部登入

當使用者未核准要求的授權需求時,AccessDeniedPath 可以提供使用者代理程式的重新導向路徑。

下列程式碼會將 AccessDeniedPath 設定為 "/AccessDeniedPathInfo"

services.AddAuthentication().AddFacebook(options =>
{
    options.AppId = Configuration["Authentication:Facebook:AppId"];
    options.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
    options.AccessDeniedPath = "/AccessDeniedPathInfo";
});

我們建議 AccessDeniedPath 頁面包含下列資訊:

  • 遠端驗證已取消。
  • 此應用程式需要驗證。
  • 若要再次嘗試登入,請選取 [登入] 連結。

測試 AccessDeniedPath

  • 瀏覽至 facebook.com
  • 如果您已登入,則必須登出。
  • 執行應用程式,然後選取 Facebook 登入。
  • 選取 [暫時不要]。 系統會將您重新導向至指定的 AccessDeniedPath 頁面。

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

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

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

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

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

多個驗證提供者

當應用程式需要多個提供者時,請鏈結 AddAuthentication 背後的提供者擴充方法:

services.AddAuthentication()
    .AddMicrosoftAccount(microsoftOptions => { ... })
    .AddGoogle(googleOptions => { ... })
    .AddTwitter(twitterOptions => { ... })
    .AddFacebook(facebookOptions => { ... });

如需 Facebook 驗證所支援設定選項的詳細資訊,請參閱 FacebookOptions API 參考。 組態選項可用瑜:

  • 要求有關使用者的不同資訊。
  • 新增查詢字串引數來自訂登入體驗。

疑難排解

  • 僅限 ASP.NET Core 2.x:如果未經由在 ConfigureServices 中呼叫 services.AddIdentity 來設定 Identity,則嘗試驗證會導致 ArgumentException:必須提供 'SignInScheme' 選項。 本教學課程中使用的專案範本可確保這樣做。
  • 如果尚未經由套用初始移轉來建立網站資料庫,則在處理要求 錯誤時,您會發生 資料庫作業失敗。 點選 [套用移轉] 以建立資料庫並重新整理以繼續超過錯誤。

下一步

  • 本文說明如何使用 Facebook 進行驗證。 您可以遵循類似的方法來向上一頁所列的其他提供者進行驗證。

  • 將網站發佈至 Azure Web 應用程式後,您應該在 Facebook 開發人員入口網站中重設 AppSecret

  • 在 Azure 入口網站中將 Authentication:Facebook:AppIdAuthentication:Facebook:AppSecret 設定為應用程式設定。 設定系統已設為從環境變數讀取金鑰。