天天看點

ASP.NET Identity入門系列教程(一) 初識Identity

通過本文你将了解ASP.NET身份驗證機制,表單認證的基本流程,ASP.NET Membership的一些弊端以及ASP.NET Identity的主要優勢。

身份驗證(Authentication)和授權(Authorization)

ASP.NET身份驗證方式

了解表單驗證流程

認識ASP.NET Membership

擁抱ASP.NET Identity

ASP.NET Identity主要組成部分

總結

我們先來思考一個問題:如何建構安全的WEB應用?

一直以來,這都是比較熱門的話題。不幸的是,目前還沒有一種萬能方法,來保證您的WEB應用是絕對安全的。不管是系統本身的漏洞,還是其他外來的攻擊,我們每天都飽受着安全問題的煎熬。

其實,我們也無需沮喪和糾結。既然,我們不能阻止攻擊,但是可以提前預防,盡量将損失減到最小,不是嗎?

目前,有許多适用于ASP.NET應用的安全原則,比如深度防禦、不信任任何輸入資料、關閉不必要的功能等等。但是,最基本的、最重要的原則還是身份驗證(Authentication)和授權(Authorization)。

初次看到這兩個概念,也許大家很容易犯迷糊。因為,Authentication和Authorization确實長得很像。其實,它們僅僅外表很像而已,内在卻大不相同。

驗證(Authentication)

驗證就是鑒定應用程式通路者身份的過程。驗證回答了以下問題:目前通路的使用者是誰?這個使用者是否有效?在日常生活中,身份驗證并不罕見。比如,通過檢查對方的證件,我們一般可以确信對方的身份。

授權(Authorization)

授權是決定驗證通過的使用者應該擁有何種級别的通路安全資源的權限。資源可以是IIS上的頁面檔案、媒體檔案(.jpeg)、壓縮檔案(.zip)等等。

下面我們簡單的描述驗證和授權的過程。

ASP.NET Identity入門系列教程(一) 初識Identity

安全問題一直是ASP.NET的關注點。其中,Windows驗證和表單驗證(Forms Authentication)就是ASP.NET兩種主要的安全機制。

Windows驗證:一般用于區域網路應用。使用Windows驗證時,使用者的Windows安全令牌在使用者通路整個網站期間使用HTTP請求,進行消息發送。應用程式會使用這個令牌在本地(或者域)裡驗證使用者賬号的有效性,也會評估使用者所在角色所具備的權限。當使用者驗證失敗或者未授權時,浏覽器就會定向到特定的頁面讓使用者輸入自己的安全憑證(使用者名和密碼)。

Forms驗證:Windows驗證的局限性非常明顯,一旦使用者有超出本地域控制器範圍的外網使用者通路網站,就會出現問題。ASP.NET表單驗證(Forms Authentication)很好的彌補了這一缺陷。使用表單驗證,ASP.NET需要驗證加密的HTTP cookie或者查詢字元串來識别使用者的所有請求。cookie與ASP.NET會話機制(session)的關系密切,在會話逾時或者使用者關閉浏覽器之後,會話和cookie就會失效,使用者需要重新登入網站建立新的會話。

ASP.NET Identity入門系列教程(一) 初識Identity

第一步 在頁面登入框輸入賬号和密碼。

第二步 檢查使用者是否有效。可以從配置檔案、SQL Server資料庫或者其他外部資料源中查找。

第三步 如果使用者有效,則在用戶端生成一個cookie檔案。cookie檔案辨別使用者已經驗證通過,當你通路網站其他資源時,不需要重新驗證。

使用表單認證能解決基本的身份驗證問題。但是,大部分應用程式還包含角色和使用者管理以及權限資訊的存儲問題。是以,我們不得不做下面這些事情:

建立使用者和角色表。

編寫通路資料表的代碼。

提供使用者和密碼驗證的方法。

幾乎每一個應用程式,我們都重複着做上面類似的事情。當微軟發現這一問題後,在ASP.NET 2.0引入了Membership的重磅級技術方案。ASP.NET Membership很好的解決了WEB應用程式在成員資格方面的常見需求,這些需求包括表單身份驗證,存儲使用者名、密碼和使用者資料資訊 (profile)等。

在很長的一段時間内,Membership極大地簡化了應用程式的編寫。然而,我們的需求越來越多,ASP.NET Membership自身設計的缺陷,難以适應這種變化。

資料庫架構受限于SQL Server。對其他資料庫很難相容。

生硬的表存儲結構。如果需要添加額外的使用者資料資訊,需要存儲在其他表,使得這些資訊難以通路(除非通過 Profile Provider API)。

系統僅依據關系資料庫設計。當然,你也可以寫一個面向非關系型資料庫的Provider(例如 Windows Azure 存儲表),但是不得不寫大量的代碼,來解決相容問題。

不能使用OWIN。由于登入、登出功能基于表單認證,第三方賬号的接入顯得比較困難。

 OWIN (Open Web Interface for .NET): OWIN 是一種定義 Web 伺服器和應用程式元件之間的互動的規範 。這一規範的目的是發展一個廣闊且充滿活力的、基于 Microsoft .NET Framework 的 Web 伺服器和應用程式元件生态系統。 Katana 是開源的的OWIN架構,主要用于微軟.NET應用程式。Katana 2.0 将随 Visual Studio 2013 一起釋出。 新版本有兩個值得關注的方面: 為自托管提供核心基礎結構元件。 提供了一套豐富的驗證中間件(包括 Facebook、Google、Twitter 和 Microsoft Account 這樣的社交提供商)以及适用于 Windows Azure Active Directory、cookie 和聯合身份驗證的提供程式。 更多資訊參考 http://owin.org/

鑒于ASP.NET Membership的弊端,微軟又開發一套新的安全架構ASP.NET Identity。ASP.NET Identity具有以下優勢:

ASP.NET Identity入門系列教程(一) 初識Identity

                                                               圖  ASP.NET Identity基本功能

統一的架構

可以輕松地整合到 ASP.NET 各種架構以及程式上。例如,ASP.NET MVC, Web Forms, Web Pages, Web API 和 SignalR等。

自定義使用者資訊

可以很友善的擴充使用者資訊。比如,添加使用者的生日,年齡等。

靈活的角色管理

ASP.NET Identity 中的角色提供程式讓你可以基于角色來限制對應用程式某個部分的通路。你可以很容易地建立諸如 “Admin” 之類的角色,并将使用者加入其中。

資料持久性以及相容性

預設情況下,ASP.NET Identity 系統将所有的資料存儲在SQL Server資料庫中,并且使用 Entity Framework Code First 實作資料庫的管理。

當然,對其他存儲媒體也有很好的支援。例如 SharePoint, Windows Azure 存儲表服務, NoSQL 資料庫等等。

單元測試能力

ASP.NET Identity 使得 Web 應用程式能夠更好地進行單元測試。

OWIN 內建

ASP.NET 驗證(Authentication)基于 OWIN 中間件,可以在任何 OWIN 的宿主上使用。ASP.NET Identity 不依賴于System.Web,完全相容 OWIN 架構,可以被用在任何由OWIN 承載的應用程式。

NuGet 包

ASP.NET Identity 作為一個 NuGet 包進行釋出,并且在 Visual Studio 2013 中作為 ASP.NET MVC, Web Forms 和 Web API 項目模闆的一部分提供。你也可以從 NuGet 庫中下載下傳到該 NuGet 包。

這種釋出方式使得 ASP.NET 團隊能夠為了添加新功能或者進行 BUG 修複更好的進行疊代,更加靈活的進行釋出給開發人員。

ASP.NET Identity入門系列教程(一) 初識Identity

                                                                                  圖 ASP.NET Identity基本組成部分

ASP.NET Identity主要包括核心功能子產品、EntityFramework子產品以及OWIN子產品。具體如下:

Microsoft.AspNet.Identity.Core 

  核心庫,包含Identity的主要功能。

Microsoft.AspNet.Identity.EntityFramework

  主要包括ASP.NET Identity 的EF 部分的實作。

Microsoft.AspNet.Identity.OWIN

  ASP.NET Identity對OWIN 的支援。

本文首先介紹了一些安全機制,然後引申到ASP.NET Membership,最後強調了ASP.NET Identity的優勢。相信本文讓大家對ASP.NET Identity有一個基本的了解,後續我将介紹如何擴充ASP.NET Identity,實作自己的使用者和角色管理。

ASP.NET Identity入門系列教程(一) 初識Identity

我叫劉皓,很高興您能閱讀完我的這篇文章。

我花了大量時間和精力來完成這篇文章,如果文章對您有幫助,請不要忘了點推薦哦!

如果您能點選右邊的打賞按鈕,打賞一杯咖啡錢,我将獲得更多的動力和能量寫出下一篇好文章。

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連結,否則保留追究法律責任的權利。

我的部落格即将搬運同步至騰訊雲+社群,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan

繼續閱讀