ASP.NET 身分識別簡介
ASP.NET 成員資格系統於 2005 年引進了 ASP.NET 2.0,此後 Web 應用程式通常會處理驗證和授權的方式有許多變更。 ASP.NET Identity 是針對 Web、手機或平板電腦開發現代應用程式時的理想成員資格系統。
我們建議使用最安全的驗證選項。 如需部署至 Azure 的 .NET 應用程式,請參閱:
Azure Key Vault 和 .NET Aspire 提供最安全的方式來儲存和擷取秘密。 Azure Key Vault 是一項雲端服務,可保護加密密鑰和秘密,例如憑證、連接字串和密碼。 如需 .NET Aspire,請參閱 主機與用戶端整合間的安全通訊。
請避免資源擁有者密碼憑證授權,因為:
- 將使用者的密碼公開給用戶端。
- 這是一個重大的安全性風險。
- 只有在無法執行其他驗證流程時,才應該使用。
當應用程式部署至測試伺服器時,環境變數可用來將連接字串設定為測試資料庫伺服器。 環境變數通常會以純文字、未加密的文字儲存。 如果計算機或進程遭到入侵,則不受信任的合作物件可以存取環境變數。 建議您不要使用環境變數來儲存生產連接字串,因為它不是最安全的方法。
設定資料指導方針:
- 請勿將密碼或其他敏感數據儲存在組態提供者程式代碼或純文本組態檔中。
- 請勿在開發或測試環境中使用生產秘密。
- 指定在專案外部的機密資訊,以免不小心提交到原始程式碼存放庫。
背景:ASP.NET 的成員資格
ASP.NET 成員資格
ASP.NET 成員資格 的設計目的是解決 2005 年常見的網站會員需求,其中包括表單驗證,以及使用者名稱、密碼和個人資料的 SQL Server 資料庫。 現今,Web 應用程式有更廣泛的數據儲存選項,大部分的開發人員都希望讓網站能夠使用社交識別提供者進行驗證和授權功能。 ASP.NET 成員資格設計的限制使得這項轉換變得困難:
- 資料庫架構是針對 SQL Server 所設計,您無法加以變更。 您可以新增配置文件資訊,但額外的數據會封裝到不同的數據表中,因此除了透過配置檔提供者 API 之外,任何方式都難以存取。
- 提供者系統可讓您變更底層資料儲存庫,但系統的設計基於適用於關係資料庫的假設。 您可以撰寫提供者,將成員資格資訊儲存在非關係型記憶體機制中,例如 Azure 記憶體數據表,但您必須撰寫許多程式碼和許多不適用於 NoSQL 資料庫的方法
System.NotImplementedException
例外狀況,藉此解決關係型設計。 - 由於登入/註銷功能是以窗體驗證為基礎,因此成員資格系統無法使用 OWIN。 OWIN 包含用於驗證的中間件元件,包括支援使用外部身分識別提供者的登入(例如Microsoft帳戶、Facebook、Google、Twitter),以及使用內部部署 Active Directory 或 Azure Active Directory 的組織帳戶登入。 OWIN 也包含 OAuth 2.0、JWT 和 CORS 的支援。
ASP.NET 簡單會員制
ASP.NET 簡單成員資格系統 已開發為 ASP.NET Web Pages 的成員資格系統。 它隨著 WebMatrix 和 Visual Studio 2010 SP1 一同發佈。 簡單成員資格的目標是讓您輕鬆地將成員資格功能新增至 Web Pages 應用程式。
簡單成員資格確實可讓您更輕鬆地自定義使用者配置檔資訊,但仍會與 ASP.NET 成員資格共用其他問題,而且有一些限制:
- 很難將成員資格系統數據保存在非關係型存放區中。
- 您無法將它與 OWIN 搭配使用。
- 它不適用於現有的 ASP.NET 成員資格提供者,而且無法擴充。
ASP.NET 通用提供者
ASP.NET 通用提供者 已開發,以便能夠將成員資格資訊保存在 azure SQL Database Microsoft中,而且也會使用 SQL Server Compact。 通用提供者是以 Entity Framework Code First 為基礎所建置,這表示通用提供者可用來將數據保存在 EF 所支援的任何存放區中。 使用通用提供者時,資料庫架構也進行了大幅度的清理。
通用提供者是以 ASP.NET 成員資格基礎結構為基礎,因此它們仍然具有與 SqlMembership 提供者相同的限制。 也就是說,它們是針對關係資料庫所設計,而且很難自訂設定檔和用戶資訊。 這些提供者仍然使用表單驗證用於登入和登出功能。
ASP.NET 身分識別
隨著多年來 ASP.NET 的成員資格故事不斷演進,ASP.NET 團隊從客戶的意見反應中學到了很多東西。
假設使用者會透過輸入已在您自己的應用程式中註冊的使用者名稱和密碼來登入,這種假設已不再有效。 網路已經變得更加社交。 用戶會透過Facebook、Twitter和其他社交網站等社交頻道即時彼此互動。 開發人員希望用戶能夠使用其社交身分識別登入,讓他們可以在其網站上擁有豐富的體驗。 新式會員系統必須提供重新導向登入功能至驗證提供者,例如 Facebook、Twitter 和其他提供者。
隨著 Web 開發的發展,Web 開發的模式也是如此。 應用程式程式代碼的單元測試成為應用程式開發人員的核心考慮。 2008 年 ASP.NET 新增了以 Model-View-Controller (MVC) 模式為基礎的新架構,部分可協助開發人員建置可測試的單元 ASP.NET 應用程式。 想要對應用程式邏輯進行單元測試的開發人員也想要能夠使用成員資格系統來執行此動作。
考慮到 Web 應用程式開發中的這些變更,ASP.NET 身分識別是以下列目標開發:
一 ASP.NET 身分識別系統
- ASP.NET 身分識別可以搭配所有 ASP.NET 架構使用,例如 ASP.NET MVC、Web Forms、Web Pages、Web API 和 SignalR。
- 當您建置 Web、手機、市集或混合式應用程式時,可以使用 ASP.NET 身分識別。
輕鬆插入關於使用者的個人資料數據
- 您可以控制使用者和設定檔資訊的結構。 例如,您可以在應用程式中註冊帳戶時,輕鬆地讓系統儲存使用者輸入的出生日期。
持續性控制
- 根據預設,ASP.NET 身分識別系統會將所有使用者資訊儲存在資料庫中。 ASP.NET 身分識別會使用 Entity Framework Code First 來實作其所有持續性機制。
- 由於您控制資料庫架構,因此變更數據表名稱或變更主鍵數據類型等常見工作很簡單。
- 很容易插入不同的儲存機制,例如 SharePoint、Azure 記憶體數據表服務、NoSQL 資料庫等,而不需要擲回
System.NotImplementedExceptions
例外狀況。
單元可測試性
- ASP.NET 身分識別可讓 Web 應用程式更容易進行單元測試。 您可以針對使用 ASP.NET Identity 的應用程式部分撰寫單元測試。
角色提供者
- 有一個角色提供者可讓您依角色限制對應用程式部分的存取。 您可以輕鬆地建立角色,例如「系統管理員」,並將使用者新增至角色。
基於權利要求的
- ASP.NET Identity 支援宣告型驗證,其中使用者的身分識別會以一組宣告表示。 宣告可讓開發人員在描述使用者的身分識別時,比角色所允許更具表現力。 角色成員屬性僅僅是一個布爾值(成員或非成員),而宣告則可以包含有關使用者身分識別和成員屬性的豐富資訊。
社交登入提供者
- 您可以輕鬆地將社交登入新增至您的應用程式,例如Microsoft帳戶、Facebook、Twitter、Google 和其他專案,並將使用者特定數據儲存在應用程式中。
OWIN 整合
- ASP.NET 驗證現在以 OWIN 中間件為基礎,可用於任何 OWIN 型主機。 ASP.NET 身分識別與 System.Web 沒有任何相依性。 它是完全相容的 OWIN 架構,可用於任何 OWIN 裝載的應用程式。
- ASP.NET 身分識別會使用 OWIN 驗證來讓使用者在網站中登入或登出。 這表示應用程式不會使用 FormsAuthentication 來產生 Cookie,而是使用 OWIN CookieAuthentication 來執行此動作。
NuGet 套件
- ASP.NET 身分識別會轉散發為 NuGet 套件,該套件會安裝在隨附於 Visual Studio 2017 的 ASP.NET MVC、Web Forms 和 Web API 範本中。 您可以從 NuGet 資源庫下載此 NuGet 套件。
- 將 ASP.NET 身分識別發行為 NuGet 套件,可讓 ASP.NET 小組更輕鬆地開發新功能及修正軟體錯誤,並更敏捷地將這些更新傳遞給開發人員。
開始使用 ASP.NET 身分識別
ASP.NET 身分識別用於 Visual Studio 2017 專案範本中,用於 ASP.NET MVC、Web Forms、Web API 和 SPA。 在本逐步解說中,我們將說明專案範本如何使用 ASP.NET Identity 來新增功能來註冊、登入和註銷使用者。
ASP.NET 身分識別是使用下列程序實作。 本文的目的是提供您 ASP.NET 身分識別的高階概觀;您可以逐步遵循它,或只是閱讀詳細數據。 如需使用 ASP.NET 身分識別建立應用程式的詳細指示,包括使用新的 API 來新增使用者、角色和配置檔資訊,請參閱本文結尾的後續步驟一節。
使用個別帳戶建立 ASP.NET MVC應用程式。 您可以在 ASP.NET MVC、Web Forms、Web API、SignalR 等中使用 ASP.NET 身分識別。在本文中,我們將從 ASP.NET MVC 應用程式開始。
建立的專案包含下列三個套件,供 ASP.NET 身分識別使用。
Microsoft.AspNet.Identity.EntityFramework
此套件具有 ASP.NET 身分識別的 Entity Framework 實作,會將 ASP.NET 身分識別數據和架構保存到 SQL Server。Microsoft.AspNet.Identity.Core
此套件具有 ASP.NET 身分識別的核心介面。 此套件可用來撰寫 ASP.NET 身分識別的實作,以不同的持續性存放區為目標,例如 Azure 數據表記憶體、NoSQL 資料庫等。Microsoft.AspNet.Identity.OWIN
此套件包含的功能,可用來在 ASP.NET 應用程式中使用 ASP.NET Identity 來插入 OWIN 驗證。 當您將登入功能新增至應用程式,並呼叫 OWIN Cookie 驗證中間件以產生 Cookie 時,就會使用此功能。
建立使用者。
啟動應用程式,然後按兩下 註冊 連結以建立使用者。 下圖顯示收集使用者名稱和密碼的 [註冊] 頁面。當使用者選取 [註冊] 按鈕時,帳戶控制器的
Register
動作會呼叫 ASP.NET 身分識別 API 來建立使用者,如下所示:[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { var user = new ApplicationUser() { UserName = model.UserName }; var result = await UserManager.CreateAsync(user, model.Password); if (result.Succeeded) { await SignInAsync(user, isPersistent: false); return RedirectToAction("Index", "Home"); } else { AddErrors(result); } } // If we got this far, something failed, redisplay form return View(model); }
登錄。
如果已成功建立使用者,則她會使用SignInAsync
方法來登入。[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; var result = await UserManager.CreateAsync(user, model.Password); if (result.Succeeded) { await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false); // For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=320771 // Send an email with this link // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id); // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme); // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>"); return RedirectToAction("Index", "Home"); } AddErrors(result); } // If we got this far, something failed, redisplay form return View(model); }
SignInManager.SignInAsync
方法會產生 ClaimsIdentity。 由於 ASP.NET 身分識別和 OWIN Cookie 驗證是以宣告為基礎的系統,因此架構需要應用程式為用戶產生 ClaimsIdentity。 ClaimsIdentity 包含用戶所有宣告的詳細資訊,例如用戶所屬的角色。登出。
選取 登出 連結以執行帳戶控制器中的 LogOff 動作。// POST: /Account/LogOff [HttpPost] [ValidateAntiForgeryToken] public ActionResult LogOff() { AuthenticationManager.SignOut(); return RedirectToAction("Index", "Home"); }
上面的高亮程式碼顯示 OWIN
AuthenticationManager.SignOut
方法。 這類似於 Web Forms FormsAuthentication 模組所使用的 FormsAuthentication.SignOut 方法。
ASP.NET 身分識別的元件
下方的圖表說明 ASP.NET Identity 系統的元件(選取 此 或按圖表以放大)。 綠色的套件組成 ASP.NET 身分識別系統。 所有其他套件都是在 ASP.NET 應用程式中使用 ASP.NET 身分識別系統所需的相依性。
以下是先前未提及之 NuGet 套件的簡短描述:
-
Microsoft.Owin.Security.Cookies
可以讓應用程式使用 Cookie 驗證的中介軟體,類似於 ASP.NET 的表單驗證。 -
EntityFramework
Entity Framework 是Microsoft關係資料庫的建議數據存取技術。
從成員資格移轉至 ASP.NET 身分識別
我們希望能很快提供指導,將現有使用 ASP.NET 成員資格或簡單成員資格的應用程式,移轉至新的 ASP.NET 身分識別系統。
後續步驟
-
使用 Facebook 和 Google OAuth2 和 OpenID 登入 建立 ASP.NET MVC 5 應用程式
本教學課程使用 ASP.NET 身分識別 API,將配置檔資訊新增至用戶資料庫,並介紹如何使用 Google 和 Facebook 驗證用戶身份。 -
使用驗證和 SQL DB 建立 ASP.NET MVC 應用程式,並部署至 Azure App Service
本教學課程示範如何使用身分識別 API 來新增使用者和角色。 - https://github.com/rustd/AspnetIdentitySample
示範如何新增基本角色和用戶支援,以及如何執行角色和使用者管理的應用程式範例。