在 Asp.Net Core 中什麼是認證和授權

2023-02-08 12:02:46

認證(Authentication) 和 授權(Authorization)在 Asp.Net core 充當了兩個不同的職責。有的老夥計在理解的時候還存在誤解。本文我們將會通過一些簡單的例子來說明這兩個概念。

認證(Authentication)識別你是誰,授權(Authorization)決定你能做什麼

加入 A 使用者現在通過瀏覽器想要存取時總的網站,這個時候我們需要知道他是誰,也就是認證。如果他是一個普通使用者,那麼他只能存取一些公開的頁面,如果他是管理員,那麼他可以存取一些管理員的頁面。這個時候我們需要知道他能做什麼,也就是授權。

因此,認證是指識別使用者的身份,而授權是指決定使用者能做什麼。

特別說明,識別你是誰的意思是,你可能被識別為一個普通使用者,也可能被識別為一個管理員,也可能被識別為一個遊客(匿名使用者)。

脫離 Asp.Net Core 認證還有另外一層意思

我們常見的 OAuth2.0 認證、OpenID Connect 認證,賬號密碼認證,二維條碼認證等等,這些認證其實是使用者與系統互動而產生憑據的過程。這些憑據可以是一個 token,也可以是一個 cookie,也可以是一個 session。這些憑據都是用來識別使用者身份的。

為了區別這種情況,我們將前者在本文中稱為「登入方式」,後者稱為「認證方式」。

而在 Asp.Net Core 中,認證是指請求中的憑據如何被轉換為一個 Principal 或者 Identity 物件。所以我們會見到 Claims-based authentication,也就是基於宣告的認證。

所以實際上整個過程,可以理解為:使用者通過登入方式登入,如果登入成功,那麼系統會產生一個憑據,這個憑據拒絕與採用的認證方式有關,而是與 Asp.Net Core 中的認證方式有關。

舉一些例子:

  • 使用者通過基於賬號密碼的 OAuth2.0 認證登入,那麼系統會產生一個 JWT token, 然後我們使用 JWT bearer 認證方式,將這個 token 作為憑據,然後 Asp.Net Core 會將這個 token 轉換為一個 Principal 或者 Identity 物件。
  • 使用者通過手機掃碼的方式登入,那麼系統會產生一個 session,然後我們使用 cookie 認證方式,將這個 session 作為憑據儲存在 Cookie中,然後 Asp.Net Core 會將這個 Cookie 轉換為一個 Principal 或者 Identity 物件。
  • 但其實我也可以這樣:使用者通過基於賬號密碼的 OAuth2.0 認證登入,那麼系統會產生一個 JWT token, 然後我們使用 cookie 認證方式,將這個 token 作為憑據儲存在 Cookie中,然後 Asp.Net Core 會將這個 token 轉換為一個 Principal 或者 Identity 物件。

一些情況

那麼結合以上情況,我們來鑑別一些詞語的意思:

  • Digest authentication: 一種認證方式,它是基於賬號密碼的,但是密碼不是明文傳輸的,而是通過雜湊演演算法計算出來的。
  • JWT bearer authentication: 一種認證方式,它是基於 JWT token 的,但是 token 不是儲存在 Cookie 中的,而是儲存在 Authorization header 中。
  • Asp.net Cookie authentication: 一種認證方式,它是基於 Cookie 的, 通過金鑰對 Cookie 進行加密,然後將加密後的 Cookie 儲存在瀏覽器中。

總結

在 Asp.Net Core 中,認證是識別使用者身份的過程,授權是決定使用者是否有許可權存取資源的過程。

參考資料

感謝您的閱讀,如果您覺得本文有用,請點贊、關注和轉發;更多精彩內容請關注我的部落格 https://www.newbe.prohttps://github.com/newbe36524/newbe36524


  1. https://learn.microsoft.com/aspnet/core/security/authentication/?view=aspnetcore-7.0&WT.mc_id=DX-MVP-5003606

  2. https://learn.microsoft.com/azure/active-directory/develop/v2-oauth2-auth-code-flow?WT.mc_id=DX-MVP-5003606