ASP.NET Identity 簡介

ASP.NET 成員資格系統是在 2005 年 ASP.NET 2.0 引進,因此 Web 應用程式通常會處理驗證和授權的方式有許多變更。 ASP.NET 身分識別是當您為 Web、手機或平板電腦建置新式應用程式時,成員資格系統應該是什麼。

背景:ASP.NET 的成員資格

ASP.NET 成員資格

ASP.NET 成員資格的設計目的是解決 2005 年常見的網站成員資格需求,其中包含表單驗證,以及使用者名稱、密碼和設定檔資料的SQL Server資料庫。 現今 Web 應用程式有更廣泛的資料儲存選項,大部分的開發人員都想要讓其網站使用社交識別提供者進行驗證和授權功能。 ASP.NET 成員資格設計的限制使這項轉換變得困難:

  • 資料庫架構是針對SQL Server所設計,您無法加以變更。 您可以新增設定檔資訊,但額外的資料會封裝到不同的資料表中,因此除了透過設定檔提供者 API 之外,難以存取。
  • 提供者系統可讓您變更支援資料存放區,但系統會針對關係資料庫適用的假設來設計。 您可以撰寫提供者,以將成員資格資訊儲存在非關聯式儲存體機制中,例如 Azure 儲存體資料表,但接著您必須撰寫許多程式碼和 System.NotImplementedException 許多不適用於 NoSQL 資料庫的方法例外狀況,以解決關聯式設計。
  • 由於登入/登出功能是以表單驗證為基礎,因此成員資格系統無法使用 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 發行。 簡單成員資格的目標是要輕鬆地將成員資格功能新增至網頁應用程式。

簡單成員資格可讓您更輕鬆地自訂使用者設定檔資訊,但仍會與 ASP.NET 成員資格共用其他問題,而且有一些限制:

  • 很難在非關聯式存放區中保存成員資格系統資料。
  • 您無法將它與 OWIN 搭配使用。
  • 它不適用於現有的 ASP.NET 成員資格提供者,而且無法擴充。

ASP.NET Universal Providers

ASP.NET Universal Providers是開發來讓成員資格資訊保存在Microsoft Azure SQL 資料庫中,而且也可以使用SQL Server Compact。 Universal Providers建置在 Entity Framework Code First 上,這表示Universal Providers可用來將資料保存在 EF 支援的任何存放區中。 有了Universal Providers,資料庫架構也會清除很多。

Universal Providers是以 ASP.NET 成員資格基礎結構為基礎,因此它們仍具有與 SqlMembership 提供者相同的限制。 也就是說,它們是針對關係資料庫所設計,而且很難自訂設定檔和使用者資訊。 這些提供者仍會使用表單驗證來登入和登出功能。

ASP.NET Identity

隨著 ASP.NET 中的成員資格故事在數年演進,ASP.NET 小組已從客戶的意見反應中學到許多。

假設使用者將輸入使用者已在您自己的應用程式中註冊的使用者名稱和密碼,就不再有效。 Web 變得更社交。 使用者會透過 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 Form、網頁、Web API 和 SignalR。
    • 當您建置 Web、手機、市集或混合式應用程式時,可以使用 ASP.NET 身分識別。
  • 輕鬆插入關於使用者的設定檔資料

    • 您可以控制使用者和設定檔資訊的架構。 例如,當您在應用程式中註冊帳戶時,您可以輕鬆地讓系統儲存使用者輸入的生日。
  • 持續性控制

    • 根據預設,ASP.NET 身分識別系統會將所有使用者資訊儲存在資料庫中。 ASP.NET 身分識別使用 Entity Framework Code First 來實作其所有持續性機制。
    • 由於您控制資料庫架構,因此變更資料表名稱或變更主鍵資料類型等常見工作很簡單。
    • 您可以輕鬆地插入不同的儲存機制,例如 SharePoint、Azure 儲存體資料表服務、NoSQL 資料庫等,而不需要擲回 System.NotImplementedExceptions 例外狀況。
  • 單元可測試性

    • ASP.NET 身分識別可讓 Web 應用程式更容易進行單元測試。 您可以針對使用 ASP.NET 身分識別的應用程式部分撰寫單元測試。
  • 角色提供者

    • 有一個角色提供者可讓您依角色限制對應用程式部分的存取。 您可以輕鬆地建立角色,例如「管理員」,並將使用者新增至角色。
  • 宣告型

    • ASP.NET 身分識別支援宣告式驗證,其中使用者的身分識別會以一組宣告表示。 宣告可讓開發人員在描述使用者的身分識別時更具表達性,而不是角色允許的身分識別。 雖然角色成員資格只是布林值 (成員或非成員) ,但宣告可以包含使用者身分識別和成員資格的豐富資訊。
  • 社交登入提供者

    • 您可以輕鬆地將社交登入新增至您的應用程式,例如 Microsoft 帳戶、Facebook、Twitter、Google 和其他專案,並將使用者特定資料儲存在您的應用程式中。
  • OWIN 整合

    • ASP.NET 驗證現在以 OWIN 中介軟體為基礎,可用於任何 OWIN 型主機。 ASP.NET 身分識別與 System.Web 沒有任何相依性。 它是完全相容的 OWIN 架構,可用於任何 OWIN 裝載的應用程式。
    • ASP.NET 身分識別會使用 OWIN 驗證來登入/登出網站中的使用者。 這表示應用程式會使用 OWIN CookieAuthentication 來執行此動作,而不是使用 FormsAuthentication 來產生 Cookie。
  • Nuget 套件

    • ASP.NET 身分識別會轉散發為 NuGet 套件,此套件會安裝在 ASP.NET MVC 中,Web Form和隨附于 Visual Studio 2017 的 Web API 範本中。 您可以從 NuGet 資源庫下載此 NuGet 套件。
    • 將 ASP.NET 身分識別發行為 NuGet 套件,可讓 ASP.NET 小組更輕鬆地逐一查看新功能和錯誤修正,並以敏捷的方式將這些套件提供給開發人員。

開始使用 ASP.NET 身分識別

ASP.NET 身分識別用於 Visual Studio 2017 專案範本中,適用于 ASP.NET MVC、Web Form、Web API 和 SPA。 在本逐步解說中,我們將說明專案範本如何使用 ASP.NET Identity 來新增功能來註冊、登入和登出使用者。

ASP.NET 身分識別是使用下列程式來實作。 本文的目的是提供您 ASP.NET 身分識別的高階概觀;您可以逐步遵循它,或只是閱讀詳細資料。 如需使用 ASP.NET 身分識別建立應用程式的詳細指示,包括使用新的 API 來新增使用者、角色和設定檔資訊,請參閱本文結尾的後續步驟一節。

  1. 使用個別帳戶建立 ASP.NET MVC 應用程式。 您可以在 ASP.NET MVC、Web Form、Web API、SignalR 等中使用 ASP.NET 身分識別。在本文中,我們將從 ASP.NET MVC 應用程式開始。

    新 ASP dot Net 專案視窗的影像

  2. 建立的專案包含下列三個套件,用於 ASP.NET 身分識別。

    • Microsoft.AspNet.Identity.EntityFramework
      此套件具有 ASP.NET Identity 的 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 時,就會使用此功能。
  3. 建立使用者。
    啟動應用程式,然後按一下 [ 註冊 ] 連結以建立使用者。 下圖顯示收集使用者名稱和密碼的 [註冊] 頁面。

    建立新帳戶的影像

    當使用者選取 [ 註冊 ] 按鈕時, 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);
    }
    
  4. 登入。
    如果使用者已成功建立,則她已由 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 具有使用者所有宣告的相關資訊,例如使用者所屬的角色。

  5. 登出。
    選取 [登出 ] 連結,以在帳戶控制器中呼叫 LogOff 動作。

    // POST: /Account/LogOff
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        AuthenticationManager.SignOut();
        return RedirectToAction("Index", "Home");
    }
    

    上述醒目提示的程式碼會顯示 OWIN AuthenticationManager.SignOut 方法。 這類似于formsAuthentication.SignOut方法,在 Web Form 中使用FormsAuthentication模組。

ASP.NET 身分識別的元件

下圖顯示 ASP.NET 身分識別系統的元件, (在此 或圖表上選取以放大) 。 綠色封裝構成 ASP.NET 身分識別系統。 所有其他套件都是在 ASP.NET 應用程式中使用 ASP.NET 身分識別系統所需的相依性。

此圖顯示 A S P 點 Net 身分識別系統的元件

以下是先前未提及之 NuGet 套件的簡短描述:

  • Microsoft.Owin.Security.Cookies
    可讓應用程式使用 Cookie 型驗證的中介軟體,類似于 ASP。NET 的表單驗證。
  • EntityFramework
    Entity Framework 是 Microsoft 針對關係資料庫建議的資料存取技術。

從成員資格移轉至 ASP.NET 身分識別

我們希望儘快提供將使用 ASP.NET 成員資格或簡單成員資格的現有應用程式移轉至新 ASP.NET 身分識別系統的指引。

後續步驟