ASP.NET Core 基于JWT的認證(一)

導讀

Json web token (JWT), 是為了在網(wǎng)絡應用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標準((RFC 7519).該token被設計為緊湊且安全的,特別適用于分布式站點的單點登錄(SSO)場景塞蹭。JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息匹表,以便于從資源服務器獲取資源门坷,也可以增加一些額外的其它業(yè)務邏輯所必須的聲明信息,該token也可直接被用于認證袍镀,也可被加密默蚌。

我們知道,http協(xié)議本身是一種無狀態(tài)的協(xié)議苇羡,而這就意味著如果用戶向我們的應用提供了用戶名和密碼來進行用戶認證绸吸,那么下一次請求時,用戶還要再一次進行用戶認證才行设江,因為根據(jù)http協(xié)議锦茁,我們并不能知道是哪個用戶發(fā)出的請求,所以為了讓我們的應用能識別是哪個用戶發(fā)出的請求叉存,我們只能在服務器存儲一份用戶登錄的信息码俩,這份登錄信息會在響應時傳遞給瀏覽器,告訴其保存為cookie,以便下次請求時發(fā)送給我們的應用歼捏,這樣我們的應用就能識別請求來自哪個用戶了稿存。

幾種常見的傳統(tǒng)認證機制

HTTP Basic Auth

HTTP Basic Auth簡單點說明就是每次請求API時都提供用戶的usernamepassword,簡言之瞳秽,Basic Auth是配合RESTful API 使用的最簡單的認證方式瓣履,只需提供用戶名密碼即可,但由于有把用戶名密碼暴露給第三方客戶端的風險寂诱,在生產(chǎn)環(huán)境下被使用的越來越少拂苹。因此,在開發(fā)對外開放的RESTful API時,盡量避免采用HTTP Basic Auth瓢棒。

OAuth

OAuth(開放授權)是一個開放的授權標準浴韭,允許用戶讓第三方應用訪問該用戶在某一web服務上存儲的私密的資源(如照片,視頻脯宿,聯(lián)系人列表)念颈,而無需將用戶名和密碼提供給第三方應用。

OAuth允許用戶提供一個令牌连霉,而不是用戶名和密碼來訪問他們存放在特定服務提供者的數(shù)據(jù)榴芳。每一個令牌授權一個特定的第三方系統(tǒng)(例如,視頻編輯網(wǎng)站)在特定的時段(例如跺撼,接下來的2小時內)內訪問特定的資源(例如僅僅是某一相冊中的視頻)窟感。這樣,OAuth讓用戶可以授權第三方網(wǎng)站訪問他們存儲在另外服務提供者的某些特定信息歉井,而非所有內容
下面是OAuth2.0的流程:

image

Cookie Auth

Cookie認證機制就是為一次請求認證在服務端創(chuàng)建一個Session對象柿祈,同時在客戶端的瀏覽器端創(chuàng)建了一個Cookie對象;通過客戶端帶上來Cookie對象來與服務器端的session對象匹配來實現(xiàn)狀態(tài)管理的哩至。默認的躏嚎,當我們關閉瀏覽器的時候,cookie會被刪除菩貌。但可以通過修改Cookieexpire time使cookie在一定時間內有效卢佣;

兩種對比

Token 簡介

JWT (Json Web Token)是為了在網(wǎng)絡應用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標準。

JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息箭阶,以便于從資源服務器獲取資源虚茶。比如用在用戶登錄上。

有些朋友可能會認為尾膊,我登錄只需要用緩存或者數(shù)據(jù)庫記錄下一個特征碼或者是Cookies就可以了媳危,為什么要使用JWT呢?我們知道一個數(shù)據(jù)庫或者是一個軟件冈敛,損耗時間最大的地方就是我們的 I/O(輸入輸出,通常指的就是硬盤的讀寫)鸣皂,因此我們選擇解碼一次HS256抓谴,對于現(xiàn)在的計算能力強大的計算機而言,解一次HS256比訪問一次磁盤要快得多寞缝。

基于token的鑒權機制類似于http協(xié)議也是無狀態(tài)的癌压,它不需要在服務端去保留用戶的認證信息或者會話信息。這就意味著基于token認證機制的應用不需要去考慮用戶在哪一臺服務器登錄了荆陆,這就為應用的擴展提供了便利滩届。
流程上是這樣的:


image
  • 用戶使用用戶名密碼來請求服務器
  • 服務器進行驗證用戶的信息
  • 服務器通過驗證發(fā)送給用戶一個token
  • 客戶端存儲token,并在每次請求時附送上這個token值
  • 服務端驗證token值被啼,并返回數(shù)據(jù)

這個token必須要在每次請求時傳遞給服務端帜消,它應該保存在請求頭里棠枉, 另外,服務端要支持CORS(跨來源資源共享)策略泡挺,一般我們在服務端這么做就可以了Access-Control-Allow-Origin: *辈讶。
那么我們現(xiàn)在回到JWT的主題上。

JWT 的組成

我們先來看一段jwt

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

仔細觀察我們可以發(fā)現(xiàn)這一段字符串中含有兩個 " . ",這兩個 " . "jwt分成了三份娄猫,我們分別成為頭部贱除、荷載信息、簽證信息媳溺。那么這三部分的分工是什么呢月幌?

Header

JWT的頭部承載了兩個信息

  • 聲明類型,對于Jwt來說就是jwt
  • 加密算法,通常使用SHA256,HS256

完整的頭部應該是像這樣的一個Json

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

將頭部Json進行base64加密就得到了我們的第一部分

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

Payload

第二部分是荷載信息悬蔽,Payload,你可以理解為我們的JWT是一輛大倉庫扯躺,第一部分頭部就是倉庫的名稱編號等基礎信息,而荷載信息就是倉庫的本身屯阀,包含了倉庫里面的所有貨物缅帘。這些信息又包含了三個部分:

  • 標準中注冊的聲明
  • 公共的聲明
  • 私有的聲明

標準中注冊的聲明 (建議但不強制使用)

  • iss: jwt簽發(fā)者

  • sub: jwt所面向的用戶

  • aud: 接收jwt的一方

  • exp: jwt的過期時間,這個過期時間必須要大于簽發(fā)時間

  • nbf: 定義在什么時間之前难衰,該jwt都是不可用的.

  • iat: jwt的簽發(fā)時間

  • jti: jwt的唯一身份標識钦无,主要用來作為一次性token,從而回避重放攻擊。

公共的聲明 :

公共的聲明可以添加任何的信息盖袭,一般添加用戶的相關信息或其他業(yè)務需要的必要息失暂。但不建議添加敏感信息,因為該部分在客戶端可解密鳄虱。

私有的聲明 :

私有聲明是提供者和消費者所共同定義的聲明弟塞,一般不建議存放敏感信息,因為base64是對稱解密的拙已,意味著該部分信息可以歸類為明文信息决记。

事實上我們的Header和Payload都是基于base64加密的,這種密文都是可以對稱解密的倍踪,因此請不要存放敏感信息系宫。

定義一個payload:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

進行base64加密后,得到了我們的第二部分

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

Signature

Jwt的第三部分是一個簽證信息建车,這個簽證信息由三部分組成:

  • header (base64后的)
  • payload (base64后的)
  • secret

這一部分可以理解為對前部分的一個校驗扩借,將前兩部分加密后的密文通過在Header中定義的加密方式,與服務端所傳入的密鑰進行一次加密缤至,假如前兩部分的信息被篡改的話潮罪,必然通不過最后一部分簽證的校驗。因此通過這樣保證了Jwt的安全性。

因此嫉到,保存并隱藏好我們的加密密鑰是非常重要的沃暗,假設泄露了,就意味著任何知道密鑰的人都可以輕松的對jwt進行自我簽發(fā)和驗證屯碴。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末描睦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子导而,更是在濱河造成了極大的恐慌忱叭,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件今艺,死亡現(xiàn)場離奇詭異韵丑,居然都是意外死亡,警方通過查閱死者的電腦和手機虚缎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門撵彻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人实牡,你說我怎么就攤上這事陌僵。” “怎么了创坞?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵碗短,是天一觀的道長。 經(jīng)常有香客問我题涨,道長偎谁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任纲堵,我火速辦了婚禮巡雨,結果婚禮上,老公的妹妹穿的比我還像新娘席函。我一直安慰自己铐望,他們只是感情好,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著屋摔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岸夯,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音堕扶,去河邊找鬼爱沟。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的蒜危。 我是一名探鬼主播虱痕,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辐赞!你這毒婦竟也來了部翘?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤响委,失蹤者是張志新(化名)和其女友劉穎新思,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赘风,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡夹囚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了邀窃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荸哟。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瞬捕,靈堂內的尸體忽然破棺而出鞍历,到底是詐尸還是另有隱情,我是刑警寧澤肪虎,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布劣砍,位于F島的核電站,受9級特大地震影響笋轨,放射性物質發(fā)生泄漏秆剪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一爵政、第九天 我趴在偏房一處隱蔽的房頂上張望仅讽。 院中可真熱鬧,春花似錦钾挟、人聲如沸洁灵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽徽千。三九已至,卻和暖如春汤锨,著一層夾襖步出監(jiān)牢的瞬間双抽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工闲礼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留牍汹,地道東北人铐维。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像慎菲,于是被迫代替她去往敵國和親嫁蛇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內容