主頁 > .NET開發 > ASP.NET Core實作JWT授權與認證(1.理論篇)

ASP.NET Core實作JWT授權與認證(1.理論篇)

2022-04-22 06:18:09 .NET開發

1.授權與認證的作用

1.1.資源保護

網路資源保護機制是一個鮮為人知的基本措施,比如我們會對網路相冊設定密碼并指定部分用戶才可訪問,又比如我們網盤的資源分享時設定的訪問密碼等等措施,這種資源保護的機制不光體現于此,作為軟體從業人員對于我們開發的API的訪問也是有一套保護機制的,那么對應到API的保護機制,也就是實作了一套完整的授權與認證體系,這也是基本的API介面標準,

 

實作了授權與認證的API有以下的防護作用:

1.2.傳統授權

在我們傳統的單機服務器架構模式中(應用程式只部署在一臺服務器上),大多數Web應用都采用的是一種Seesion的身份驗證方式,其中的效驗流程概況如下:

 

1.用戶在客戶端瀏覽器第一次登陸系統時,Web服務器首先會效驗用戶名和密碼的正確性,在效驗成功后,Web服務器就會為當前用戶創建一個Session物件,并將用戶資訊保存在Session中,

 2.當Session在服務器創建成功后,Web服務器會將生成的sessionID回傳給客戶端瀏覽器,客戶端瀏覽器會將sessionID保存在Cookie中,

 3.當客戶端瀏覽器再次訪問服務器時,就會向服務器發送sessionID,服務器在接收處理請求時就會判斷這個sessionID對應的Session資訊,是否進行登錄過并有相應的身份資訊,然后根據對應的身份資訊,進行對該用戶的權限判斷,看是否能訪問相應的資源,

 

1.3.傳統授權的局限

當網站業務規模和訪問量的逐步發展擴張后,傳統的單機服務器架構模式不在滿足應用需求,這個時候服務器架構就會從單臺演變為多臺服務器的架構模式(集群、分布式等),

 那么在這種多臺服務器的架構模式中,對于傳統的session的身份驗證方式就會產生“局限”,因為基于Seesion默認的規則上,session是不能跨服務器共享資料的,

 這就是意味著,用戶在第一次訪問應用時,分配到A服務器登陸驗證成功后,第二次訪問應用時分配到B服務器時,對于B服務器而言,用戶就是一個未登陸未驗證的用戶,

 

當然,如何去解決session跨服務器共享資料的方案也存在,但這種“補救式”的措施并非一套標準規范的授權認證體系,而本文將有講解的重點JWT,它就是一套標準化授權認證體系,并且可以解決session身份驗證方式存在的短板問題,


2.介紹JWT

2.1.什么是JWT

JWT(JSON Web Token),但從字義上來解釋的話,它其實就是用于在Web應用中的一種JSON格式令牌,它一般傳遞在“身份提供者”和“服務提供者”之間,“身份提供者”需要通過JWT作為一種宣告自身安全資訊的令牌,從而得到“服務提供者”的信任,以便于從服務器獲取相應的資源,

 JWT不光體現在令牌資訊本身,它更是一種標準化的資料傳輸規范,以及作為一個開放的標準(RFC 7519),定義了一種簡潔的、自包含的方法只要是在系統之間傳輸簡短,但卻需要一定安全等級的資料時,都可以使用JWT規范來傳輸,

 所以JWT作為了時下流行的授權與認證方案,它并不局限于某個開發平臺,在其他語言框架中都有基于JWT規范的實作方案,另外在應用層面,JWT還被廣泛的適用于分布式站點的單點登陸中,

 

2.2.JWT具有的好處

1.通用:基于JSON格式的通用性,所以JWT是可以進行跨語言的,像Java、JavaScript、PHP、Python等很多語言都可以使用,

2.緊湊:JWT的構成非常簡單,占用的位元組很小,可以將其方在HTTP請求報文頭Header、URL、Cookie中進行傳輸,

3.擴展:JWT包含了常用的身份驗證結構資訊,并且支持自定義結構,另外不在依賴服務端創建Seesion存盤資訊,非常易于應用的擴展,

 

 2.3.JWT在Web中的請求流程

對上圖的流程補充描述如下:

1.客戶端在登陸時向授權服務系統發起請求,以便申請“令牌”;

2.授權服務根據用戶身份,生成一張專屬“令牌”,該“令牌”以JWT格式規范回傳給客戶端;

3.客戶端將獲取到的“令牌”放到HTTP報文的Headers中后,向介面服務發起請求,

4.介面服務收到請求后,會從HTTP報文的Headers中獲取“令牌”,并從“令牌”中決議出該用戶的身份權限資訊,然后判斷做出相應的處理,從而決定是否允許訪問對應的資料資源


3.JWT資訊結構

JWT主要由三部分組成:頭資訊(Header)、訊息體(Payload)、簽名(Signature),

3.1.頭資訊(Header)

頭資訊(Header)主要由兩個部分組成:alg、typ,alg表示JWT的簽名演算法,一般有兩個選擇,默認使用的是HS256,另外一種是RS256,typ代表的是Token的型別,對應的JSON表現形式如下:

{
  "alg":"HS256",
  "typ":"JWT"
}

3.2.訊息體(Payload)

訊息體(Payload)又叫做“載荷”,可以根據JWT的預定義結構或自定義的結構存放資訊,一般包括用戶資訊或產品資訊等,另外Payload中的存放的資訊,在ASP.NET Core的驗證模型“Claims Based Authentication”又有一種概念叫做“Claim(宣告)”,

 

什么是Claim

Claim是對被驗證主體特征的一項描述,就拿登陸中的被驗證主體用戶而言,那么對應的Claim包括:

“用戶名是zhangsan”,“email是[email protected]”,“手機號碼是15654541212”,在Claim當中還包括ClaimType,ClaimType代表描述資訊的型別,以上的例子而言,其中ClaimType包括:用戶名、email、手機號碼,

 將上面Claim和ClaimType概念對應到現實中的事物來看,比如“檢查駕照”,駕駛員對于交警就是一個被驗證的主體,駕照中的“駕駛員姓名:章某某”、“身份證號碼:4545454545”等一些描述資訊就相當于是一個Claim,

 對于一個被驗證主體(用戶)而言,肯定不會僅僅存在單個Claim,而會存在多個Claim,那么對于多個Claim構成的資料結構就是“ClaimsIdentity”,可以把“ClaimsIdentity”理解為是被驗證主體的“證件”,另外,“ClaimsIdentity”的持有者也就是被驗證主體被稱為“ClaimsPrincipal”,

 

通常一個簡單的載荷JSON如下:

{
 "iss":"WebApi",
 "aud":"JD-ERP", 
 "exp":"1650445011"
}

3.3.簽名(Signature)

簽名實際上是一個加密的程序,基于特定內容和指定演算法生成的一段標識,作為驗證接收方傳遞資訊是否被篡改的依據,JWT簽名作為JWT結構的一部分,其中的內容是包括:Header、PayLoad、密鑰,然后通過簽名演算法將三者生成特定字串,

 

在JWT簽名演算法中,一般有兩個選擇,一種是默認的HS256,另一種就是RS256,

RS256是一種“非對稱加密演算法”,它擁有一組密鑰(公鑰和私鑰),私鑰用于加密(簽名),公鑰用于解密(驗證簽名),而HS256則是一種“對稱加密演算法”,加密(簽名)和解密(驗證簽名)都使用同一種密鑰,基于這兩種演算法的理解,在實際的應用當中使用RS256簽名方式會更加安全,

3.4.內容表現形式

JWT會基于一種物件結構生成特定格式的字串,字串中根據JWT的結構也對應了有三個部分,分別由“.”號分割,我們可以通過JWT官方的站點(https://jwt.io/)來查看JWT全部表現形式,以及可以對其進行分析,

 

 

 上圖左側區域的資料,其中紅色部分是“訊息頭”,紫色部分是“載荷”,它們都是基于JSON格式的資料上進行了base64的編碼,才變成了一種特定的字符,藍色部分就是“簽名”,它是由:訊息頭、載荷、密鑰,三個JSON格式資料進行簽名生成的一種特定字符,

上圖右側區域的資料,是將JWT的Token字串放在左側區域決議出來的,通過決議出來的JSON資料就可以方便做一些除錯分析,另外,在底部的“簽名”區域,就可以清晰的看出我們簽名字串是通過什么樣的方式生成的,其中的密鑰部分是需要我們手動輸入的,輸入后就可以驗證左側的Token是否有效,


 4.結尾

本文主要介紹了關于JWT的理論部分,其中主要包括:作用、應用場景、概念、以及對應的結構等,其中弄懂這些概念也不是一蹴而就的,需要結合實際的操作進行演練才能更有深刻的體會,那么在下一個章節,我會主要介紹如何通過代碼一步步在ASP.NET Core中實作JWT的授權與認證,

知識改變命運

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/460727.html

標籤:.NET技术

上一篇:關于 winform GridView 的操作

下一篇:C# 11 對 ref 和 struct 的改進

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more