# Bee.OAuth2 for .NET:快速整合 OAuth2 登入 ![bee-oauth2](https://hackmd.io/_uploads/r1Kkvdtcxx.png) >開發 Web 或桌面應用時,整合第三方登入最常見的方法就是 OAuth2,尤其用於串接 Google、Facebook、LINE、Azure、Auth0 等外部身份服務。需要注意的是:OAuth2 本質上是 **授權(Authorization)標準**,並不是身份驗證(Authentication)。 實際流程是:**先取得授權,再藉由授權去交換 Token 並取回用戶身份資訊**。 Bee.OAuth2 套件組包含五個套件,可協助 .NET 開發者快速、安全地整合 OAuth2,無論是在 Web 或 Windows Forms 應用程式中。 - **Bee.OAuth2** - **Bee.OAuth2.AspNet** - **Bee.OAuth2.AspNetCore** - **Bee.OAuth2.WinForms** - **Bee.OAuth2.Desktop** --- ## 1️⃣ Bee.OAuth2 – 核心模組 輕量化 .NET OAuth2 函式庫,支援 Google、Facebook、LINE、Azure、Auth0 等供應商的授權流程。 - **目標框架**:.NET Standard 2.0 - **用途**:取得授權網址、交換 Token、讀取使用者資訊。 - **適用場景**:共用程式庫、後端服務。 - **擴充性**:原始碼已開放,可自行新增 Provider。 ### 使用範例 ```csharp var options = new GoogleOAuth2Options { ClientId = "...", ClientSecret = "...", RedirectUri = "http://localhost", Scopes = { "openid", "email", "profile" } }; var provider = new GoogleOAuth2Provider(options); string authUrl = provider.GetAuthorizationUrl("random_state"); ``` --- ## 2️⃣ Bee.OAuth2.AspNet – ASP.NET 專用 - **目標框架**:.NET Framework 4.8 - **用途**:為 ASP.NET WebForms 與 MVC 專案提供簡化的 OAuth2 認證流程。 ### 使用流程 1. 註冊 Client ```csharp var options = new GoogleOAuth2Options { ... }; var client = new OAuth2Client(options); OAuth2Manager.RegisterClient("Google", client); ``` 2. 導向授權頁 ```csharp OAuth2Manager.RedirectToAuthorization("Google"); ``` 3. 處理回呼並取得使用者資訊 ```csharp var result = await OAuth2Manager.ValidateAuthorization(); ``` --- ## 3️⃣ Bee.OAuth2.AspNetCore – ASP.NET Core 專用 - **目標框架**:.NET 8+ - **用途**:透過 DI 與 OAuth2Manager 集中管理,快速整合多家登入供應商。 ### 使用流程 1. Program.cs 註冊 ```csharp builder.Services.AddSingleton<OAuth2Manager>(provider => { var http = provider.GetRequiredService<IHttpContextAccessor>(); var options = new GoogleOAuth2Options { ... }; var client = new OAuth2Client(options, http); var manager = new OAuth2Manager(http); manager.RegisterClient("Google", client); return manager; }); ``` 2. Controller ```csharp public IActionResult Login() { _oauth2Manager.RedirectToAuthorization("Google"); return new EmptyResult(); } public async Task<IActionResult> Callback() { var result = await _oauth2Manager.ValidateAuthorization(); ... } ``` --- ## 4️⃣ Bee.OAuth2.WinForms – Windows Forms (.NET Framework 4.8) - **目標框架**:.NET Framework 4.8 - **用途**:在 Windows Forms 應用中整合 OAuth2 登入流程。 - **特色**:在 WinForms 程式中使用 WebView2 進行 OAuth2 登入。 ### 使用流程 ```csharp var options = new GoogleOAuth2Options { ... }; var client = new OAuth2Client(options) { Caption = "Google Login", Width = 600, Height = 800 }; OAuth2Manager.RegisterClient("Google", client); var result = await OAuth2Manager.Login("Google"); ``` --- ## 5️⃣ Bee.OAuth2.Desktop – Windows Forms (.NET 8+) - **目標框架**:.NET 8+ - **用途**:在 Windows Forms (.NET 8+) 應用中整合 OAuth2 登入流程。 - **特色**:在 WinForms 程式中使用 WebView2 進行 OAuth2 登入。 ### 使用流程 ```csharp var options = new GoogleOAuth2Options { ... }; var client = new OAuth2Client(options) { Caption = "Google Login", Width = 600, Height = 800 }; OAuth2Manager.RegisterClient("Google", client); var result = await OAuth2Manager.Login("Google"); ``` --- ## 🔑 state 加密機制 在 OAuth2 驗證流程中,`state` 參數主要用來防止 CSRF 攻擊。 Bee.OAuth2 套件內建 **AES-CBC + HMAC** 的 `state` 加密機制: - 需事先產生 **64-byte Base64 金鑰**,並設定為 **`OAUTH2_STATE_KEY`** 環境變數。 - 若未設定,`state` 僅做 Base64 編碼,**不保證機密性與完整性**。 ```csharp // 產生 Base64 格式的金鑰 var key = Bee.Base.AesCbcHmacKeyGenerator.GenerateCombinedKey(); Console.WriteLine(Convert.ToBase64String(key)); ``` --- ## 🔍 前後端分離架構下的最佳實踐 若系統採用 **前後端分離架構**,建議的流程是: **前端僅負責向 Provider 取得授權碼 (Authorization Code),後端再利用授權碼換取 Token 並取得用戶身份**。 這樣可以避免 Client Secret 暴露於前端,並讓身份管理集中於後端,確保安全性與一致性。 ### 流程 1. **前端 (Browser / App)** - 導向 Google / Facebook / LINE / Azure / Auth0 等授權伺服器。 - 使用者授權後,伺服器回傳 Authorization Code。 2. **後端 (API Server)** - 接收授權碼並使用 Client Secret 向 Provider 交換 Access Token / ID Token。 - 使用 Access Token 呼叫 UserInfo Endpoint 取得用戶資訊。 3. **系統內部** - 後端確認身份後,產生 Session Token / JWT,回傳給前端使用。 ### 優點 - **安全性**:Client Secret 僅在後端保存。 - **一致性**:統一身份管理,可整合 RBAC 或內部帳號系統。 - **擴充性**:支援多 Provider,最終映射到同一套用戶模型。 ### Authorization 與 Login 的差異 於 `Bee.OAuth2.WinForms` 與 `Bee.OAuth2.Desktop` 套件中,`OAuth2Client` 提供兩個方法: | 方法 | 功能 | 適用情境 | |-------------------|------|----------| | **Authorization()** | 僅取得授權碼 (Authorization Code)。 | 前後端分離:前端將授權碼交給後端換取 Token 與身份。 | | **Login()** | 直接交換 Token 並回傳用戶身份 (`AuthorizationResult`)。 | 桌面應用或單機情境,需立即取得身份。 | --- ## 📦 套件比較總表 | 套件名稱 | 目標框架 | 適用場景 | NuGet 連結 | |-------------------------|--------------------|--------------------|-----------| | **Bee.OAuth2** | .NET Standard 2.0 | 核心程式庫、後端服務 | [NuGet](https://www.nuget.org/packages/Bee.OAuth2) | | **Bee.OAuth2.AspNet** | .NET Framework 4.8 | ASP.NET WebForm/MVC | [NuGet](https://www.nuget.org/packages/Bee.OAuth2.AspNet) | | **Bee.OAuth2.AspNetCore** | .NET 8+ | ASP.NET Core API/MVC | [NuGet](https://www.nuget.org/packages/Bee.OAuth2.AspNetCore) | | **Bee.OAuth2.WinForms** | .NET Framework 4.8 | Windows Forms 應用 | [NuGet](https://www.nuget.org/packages/Bee.OAuth2.WinForms) | | **Bee.OAuth2.Desktop** | .NET 8+ | Windows Forms 應用 | [NuGet](https://www.nuget.org/packages/Bee.OAuth2.Desktop) | --- ## 📚 延伸閱讀 - [GitHub 原始碼](https://github.com/jeff377/bee-oauth2) - [OAuth 2.0 規格](https://datatracker.ietf.org/doc/html/rfc6749) - [OAuth2 標準參數對照表](https://hackmd.io/@jeff377/oauth2-parameters) - [OAuth2 vs OpenID Connect vs SAML 整合認證比較](https://hackmd.io/@jeff377/oauth2-vs-oidc-vs-saml) --- **📢 歡迎轉載,請註明出處** **📬 歡迎追蹤我的技術筆記與實戰經驗分享** [Facebook](https://www.facebook.com/profile.php?id=61574839666569) | [HackMD](https://hackmd.io/@jeff377) | [GitHub](https://github.com/jeff377) | [NuGet](https://www.nuget.org/profiles/jeff377)