ASP.NET Core 中的 Google 外部登入設定
作者:Valeriy Novytskyy 和 Rick Anderson
本教學課程說明如何使用在上一頁建立的 ASP.NET Core 專案,讓使用者使用其 Google 帳戶登入。
建立 Google OAuth 2.0 用戶端識別碼和秘密
遵循將 Google 登入整合到 Web 應用程式中的指引 (Google 文件)。
專案必須先存在,您可能必須建立一個專案。 選取專案之後,請輸入儀表板。
在儀表板的 Oauth 同意畫面中:
- 選取 [使用者類型 - 外部] 和 [建立]。
- 在 [應用程式資訊] 對話方塊中,提供應用程式的「應用程式名稱」、「使用者支援電子郵件」和「開發人員連絡資訊」。
- 逐步執行 [範圍] 步驟。
- 逐步執行 [測試使用者] 步驟。
- 檢閱 [OAuth 同意畫面],並返回應用程式 [儀表板]。
在應用程式儀表板的 [認證] 索引標籤中,選取 [建立認證]>[OAuth 用戶端識別碼]。
選取 [應用程式類型]>[Web 應用程式],選擇「名稱」。
在 [授權重新導向 URI] 區段中,選取 [新增 URI] 以設定重新導向 URI。 範例重新導向 URI:
https://localhost:{PORT}/signin-google
,其中{PORT}
預留位置是應用程式的連接埠。選取 [建立] 按鈕。
儲存 [用戶端識別碼] 和 [用戶端密碼],以用於應用程式的組態。
部署網站時,請執行下列其中一項:
- 將 [Google 主控台] 中的應用程式重新導向 URI 更新為應用程式的已部署重新導向 URI。
- 使用應用程式的生產重新導向 URI,在 [Google 主控台] 中為生產應用程式建立新的 Google API 註冊。
儲存 Google 用戶端識別碼和秘密
使用秘密管理員儲存敏感性設定,例如 Google 用戶端識別碼和秘密值。 針對此範例,使用下列步驟:
依照啟用秘密儲存體的指示,初始化秘密儲存體的專案。
使用秘密金鑰
Authentication:Google:ClientId
和Authentication: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:ClientId
和Authentication:Google:ClientSecret
設定為應用程式設定。 設定系統已設為從環境變數讀取金鑰。