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

作者:Valeriy NovytskyyRick Anderson

本教學課程說明如何使用在上一頁建立的 ASP.NET Core 專案,讓使用者使用其 Google 帳戶登入。

建立 Google OAuth 2.0 用戶端識別碼和秘密

  • 遵循將 Google 登入整合到 Web 應用程式中的指引 (Google 文件)。

  • 移至 Google API & Services

  • 專案必須先存在,您可能必須建立一個專案。 選取專案之後,請輸入儀表板

  • 儀表板Oauth 同意畫面中:

    • 選取 [使用者類型 - 外部] 和 [建立]
    • 在 [應用程式資訊] 對話方塊中,提供應用程式的「應用程式名稱」、「使用者支援電子郵件」和「開發人員連絡資訊」
    • 逐步執行 [範圍] 步驟。
    • 逐步執行 [測試使用者] 步驟。
    • 檢閱 [OAuth 同意畫面],並返回應用程式 [儀表板]
  • 在應用程式儀表板的 [認證] 索引標籤中,選取 [建立認證]>[OAuth 用戶端識別碼]

  • 選取 [應用程式類型]>[Web 應用程式],選擇「名稱」

  • 在 [授權重新導向 URI] 區段中,選取 [新增 URI] 以設定重新導向 URI。 範例重新導向 URI:https://localhost:{PORT}/signin-google,其中 {PORT} 預留位置是應用程式的連接埠。

  • 選取 [建立] 按鈕。

  • 儲存 [用戶端識別碼] 和 [用戶端密碼],以用於應用程式的組態。

  • 部署網站時,請執行下列其中一項:

    • 將 [Google 主控台] 中的應用程式重新導向 URI 更新為應用程式的已部署重新導向 URI。
    • 使用應用程式的生產重新導向 URI,在 [Google 主控台] 中為生產應用程式建立新的 Google API 註冊。

儲存 Google 用戶端識別碼和秘密

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

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

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

    dotnet user-secrets set "Authentication:Google:ClientId" "<client-id>"
    dotnet user-secrets set "Authentication:Google:ClientSecret" "<client-secret>"
    

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

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

您可以在 API 主控台中管理 API 認證和使用方式。

設定 Google 驗證

Microsoft.AspNetCore.Authentication.Google NuGet 套件新增至應用程式。

將驗證服務新增至 Startup.ConfigureServices

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>(options =>
        options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddRazorPages();

    services.AddAuthentication()
        .AddGoogle(options =>
        {
            IConfigurationSection googleAuthNSection =
                Configuration.GetSection("Authentication:Google");

            options.ClientId = googleAuthNSection["ClientId"];
            options.ClientSecret = googleAuthNSection["ClientSecret"];
        });
}

將驗證服務新增至 Program

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

services.AddAuthentication().AddGoogle(googleOptions =>
    {
        googleOptions.ClientId = configuration["Authentication:Google:ClientId"];
        googleOptions.ClientSecret = configuration["Authentication:Google:ClientSecret"];
    });

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

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

以 Google 登入

  • 執行應用程式並選取 [登入]。 可供使用 Google 登入的選項隨即出現。
  • 選取 [Google] 按鈕,其會重新導向至 Google 以進行驗證。
  • 輸入 Google 認證之後,系統會將您重新導向回到網站。

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

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

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

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

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

多個驗證提供者

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

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

如需 Google 驗證所支援設定選項的詳細資訊,請參閱 GoogleOptions API 參考。 這可用於要求使用者的不同資訊。

變更預設回呼 URI

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

疑難排解

  • 如果登入無法運作,且您未收到任何錯誤,請切換至開發模式,讓問題更容易偵錯。
  • 如果 Identity 未透過在 ConfigureServices 中呼叫 services.AddIdentity 來設定,嘗試驗證將會產生 ArgumentException:必須提供 'SignInScheme' 選項。 本教學課程中使用的專案範本可確保已設定 Identity。
  • 如果尚未經由套用初始移轉來建立網站資料庫,則在處理要求 錯誤時,您會發生 資料庫作業失敗。 選取 [套用移轉] 以建立資料庫,並重新整理頁面以繼續超過錯誤。
  • 成功驗證 OAuth 2.0 提供者 (例如 Google) 的要求之後,出現 HTTP 500 錯誤:請參閱此 GitHub 問題
  • 如何使用 Google for React 和其他 SPA 應用程式來實作外部驗證:請參閱此 GitHub 問題

下一步

  • 本文說明如何使用 Google 進行驗證。 您可以遵循類似的方法來向上一頁所列的其他提供者進行驗證。
  • 將應用程式發佈至 Azure 之後,請在 Google API 主控台中重設 ClientSecret
  • 在 Azure 入口網站中將 Authentication:Google:ClientIdAuthentication:Google:ClientSecret 設定為應用程式設定。 設定系統已設為從環境變數讀取金鑰。