[ASP.NET MVC] ASP.NET Identity登入技術剖析

[ASP.NET MVC] ASP.NET Identity登入技術剖析

前言

ASP.NET Identity是微軟所貢獻的開源項目,用來提供ASP.NET的驗證、受權等等機制。本篇文章介紹ASP.NET Identity在執行登入功能時,與瀏覽器、還有第三方驗證服務之間的運做流程。主要爲本身留個紀錄,也但願能幫助到有須要的開發人員。(本篇內容大幅度簡化了ASP.NET Identity的運做細節,用以傳達登入功能的運做概念。實際ASP.NET Identity在運做的時候,比本篇說明的複雜不少。)git

前言01

Unauthorized(未登入)

未登入01

  1. 當使用者使用瀏覽器,第一次進入ASP.NET站臺。github

  2. 由於尚未完成登入的動做,因此被ASP.NET判斷爲「未登入」。瀏覽器

  3. 這時使用者要求使用的資源,若是是被打上[Authorize]標籤的Controller或是Action。[Authorize]標籤會判別用戶未登入,就回傳HTTP 401狀態代碼。post

  4. ApplicationCookieMiddleware是一個Identity掛載到ASP.NET的Middleware,這個Middleware會去攔截HTTP 401狀態代碼。編碼

    未登入02

  5. ApplicationCookieMiddleware攔截到HTTP 401狀態代碼以後,會更改回傳的內容。改成回傳HTTP 302狀態代碼以及一個Login頁面的URL。code

    未登入03

  6. 瀏覽器接收到HTTP 302狀態代碼,會自動跳轉頁面到回傳內容所夾帶的Login頁面URL。blog

  7. ASP.NET站臺會回傳Login頁面給瀏覽器,要求用戶進行登入做業。資源

Authentication(驗證)

驗證01

  1. 使用者在Login頁面,選擇使用Facebook驗證後,Login頁面會連結到ExternalLogin這個Action。開發

  2. ExternalLogin在收到使用者選擇使用Facebook驗證後,會回傳一個ChallengeResult, 來引起Challenge。由於使用者是選擇使用Facebook驗證,因此這個Challenge動做會交由FacebookAuthenticationMiddleware來處理。get

  3. 接着FacebookAuthenticationMiddleware會發起一個OAuth的流程,來在Facebook站臺、用戶瀏覽器之間交換信息,用以認證一個使用者。(參考數據:OAuth 2.0 筆記 - Yu-Cheng Chuang)

  4. 完成OAuth流程以後,FacebookAuthenticationMiddleware就能夠依照取得的用戶信息,來創建一個FBUser。

  5. FBUser會被拿來作爲SignIn動做的參數。這個SignIn動做,會被導到Identity掛載的ExternalCookieMiddleware去執行。

    驗證02

  6. 在ExternalCookieMiddleware裏,會將FBUser編碼爲Cookie內容,而且附加到回傳內容裏。

  7. 完成SignIn動做後,FacebookAuthenticationMiddleware會更改回傳的內容。改成回傳HTTP 302狀態代碼、編碼爲Cookie內容的FBUser、以及一個ExternalLoginCallback URL。

Authorization(受權)

受權01

  1. 瀏覽器接收到HTTP 302狀態代碼,會自動跳轉頁面到回傳內容所夾帶的ExternalLoginCallback URL,而且也同時回傳編碼爲Cookie內容的FBUser。

  2. ASP.NET會從Cookie內容裏譯碼出FBUser,而且依照編碼FBUser爲Cookie時的定義,將登入狀態定義爲「未登入」。

    受權02

  3. 接着這個FBUser,會被提交給ASP.NET Identity,用以從Identity裏取得系統使用的APPUser。這個APPUser除了用戶相關數據外,也包含了受權給該用戶的Role數據。

  4. APPUser會被拿來作爲SignIn動做的參數。這個SignIn動做,會被導到Identity掛載的ApplicationCookieMiddleware去執行。

  5. 在ApplicationCookieMiddleware裏,會將APPUser編碼爲Cookie內容,而且附加到回傳內容裏。

  6. 完成SignIn動做後,ASP.NET Identity會更改回傳的內容。改成回傳HTTP 302狀態代碼、以及編碼爲Cookie內容的APPUser。

Authorized(已登入)

已登入01

  1. 完成上述流程以後。使用者每次使用瀏覽器進入ASP.NET站臺時,都會夾帶編碼爲Cookie內容的APPUser。

  2. ASP.NET會從Cookie內容裏譯碼出APPUser,而且依照編碼APPUser爲Cookie時的定義,將登入狀態定義爲「已登入」。

    已登入02

  3. 使用者要求使用的資源,若是是被打上[Authorize]標籤的Controller或是Action。[Authorize]標籤會判別用戶已登入,容許並執行功能內容。

  4. ASP.NET站臺執行執行功能內容後,會回傳功能頁面給瀏覽器。至此也就完成了,整個ASP.NET Identity登入的流程。

相關文章
相關標籤/搜索