1. 程式人生 > >IdentityServer學習筆記彙總(實現傳送門在底部)

IdentityServer學習筆記彙總(實現傳送門在底部)

前言

網際網路時代,對資訊和資源的保護越發苛刻,在所有應用中授權和認證是必不可少缺少的一部分。如果一個應用沒有授權和認證那麼這個應用就是不完整或者說不安全的應用。在.Net平臺給我們提供了一套完整的授權認證框架,那就是IdentityServer4。它實現了OpenId Connect和OAuth2.0協議的認證授權。

授權認證

很多人喜歡把授權和認證混為一談,但是其實授權(Authorization)和認證(Authentication)是有區別的。
Authorization(授權) - 側重點是使用者能幹嘛,而不關心使用者是誰。
Authentication(認證) - 側重點是使用者是誰,而不是使用者能幹嘛。

OpenId

OpenID 是一個以使用者為中心的數字身份識別框架,是一個以URL為身份標識的分散式身份驗證解決方案,它具有開放、分散、自由等特性。
OpenID相關基本術語:
使用者 - 想要向某個網站表明身份的人。
標識 - 使用者用以標識其身份的URL。
身份提供者 - 提供OpenID URL註冊和驗證服務的服務提供者。
依賴方 - 想要對終端使用者的openId進行驗證的網站應用。

舉個例子, 我使用QQ(身份提供者)登陸京東(依賴方),我開啟京東主頁點選QQ登陸並不會要我輸入我的QQ賬號和密碼,會先跳轉到QQ授權登陸頁面,當你掃碼或者密碼登陸的時候QQ會返回給京東一個OpenId,京東就會拿著這個OpenId來問QQ你這裡是不是有這麼一個使用者。

OpenId關注的是Authentication(認證)。

OAuth2

OAuth是當下比較流行的授權第三方應用讀取使用者的資源的機制。OAuth能在不涉及到使用者的賬號資訊的情況下,讀取使用者的一些資源資訊。

舉個例子,每週都會有保潔阿姨來家裡打掃,但是保潔阿姨並不知道我家大門的密碼,所以每次保潔阿姨在要上門的時候會在app上申請獲取一個臨時密碼,當我收到保潔阿姨的申請後,確認給予臨時密碼後保潔阿姨就能通過這個密碼進入房子啦。

我就是使用者,家,和房間就是我的資源,臨時密碼是token。阿姨是第三方應用。阿姨申請臨時密碼需要進入我的家(第三方應用申請讀取我的資料),我(使用者)收到申請後給予臨時密碼(使用者確認授權讀取資料)。阿姨收到臨時密碼進入房間(獲取到相應的token讀取資料)。

但是臨時密碼(token)還是有很多侷限性的,比如時效性(規定時間內使用才有效),侷限性(只能開一次門,不能進去我私人房間),我還可以在中途撤銷授權,使臨時密碼(token)無法進去我的房間(無法讀取我的資料)。


授權過程
(A)使用者開啟客戶端以後,客戶端要求使用者給予授權。(阿姨開啟某公寓App申請臨時密碼)
(B)使用者同意給予客戶端授權。 (我同意給予臨時密碼)
(C)客戶端使用上一步獲得的授權,向認證伺服器申請令牌。 (同意後,向某某公寓後臺申請臨時密碼)
(D)認證伺服器對客戶端進行認證以後,確認無誤,同意發放令牌。(某某公寓後臺確認我同意給予臨時密碼後,給阿姨發放臨時密碼)
(E)客戶端使用令牌,向資源伺服器申請獲取資源。(阿姨使用臨時密碼來開門)
(F)資源伺服器確認令牌無誤,同意向客戶端開放資源。(密碼鎖收到臨時密碼驗證後開門)

OAuth關注的是Authorization(授權)。

OpenId Connect

OpenID Connect簡稱OIDC。因為OAuth2是一個授權協議,它無法提供完善的身份認證功能。所以它在OAuth2上構建了一個身份層,是一個基於OAuth2協議的身份認證標準協議。OIDC使用OAuth2的授權來為第三方客戶端提供使用者的身份認證,並把對應的身份認證資訊傳遞給客戶端,且可以適用於各種型別的客戶端,並且完全相容OAuth2,也就是說你搭建了一個OIDC的服務後,也可以當作一個OAuth2的服務來用。

術語介紹

User - 使用者。
Client - 客戶端。
IdentityServer - 授權認證伺服器。
Resources - 需要保護的資源。
Access Token - 訪問令牌,允許使用者哪些資源。
Identity Token - 身份令牌,使用者確認使用者身份。

JWT

Json web token (JWT), 是為了在網路應用環境間傳遞宣告而執行的一種基於JSON的開放標準((RFC 7519).該token被設計為緊湊且安全的,特別適用於分散式站點的單點登入(SSO)場景。JWT的宣告一般被用來在身份提供者和服務提供者間傳遞被認證的使用者身份資訊,以便於從資源伺服器獲取資源,也可以增加一些額外的其它業務邏輯所必須的宣告資訊,該token也可直接被用於認證,也可被加密。
JWT是由三段字串拼接而成的,使用 . 分割的。

eyJhbGciOiJSUzI1NiIsImtpZCI6IjIxNmd3ZUVTZTA3d29hSDhpWHAzMUEiLCJ0eXAiOiJhdCtqd3QifQ.eyJuYmYiOjE1NzY2NTYwOTMsImV4cCI6MTU3NjY1OTY5MywiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAzIiwiYXVkIjoiQXBpX0EiLCJjbGllbnRfaWQiOiJjbGllbnRfYSIsInNjb3BlIjpbIkFwaV9BIl19.kdszQIZFTS8aURbF5lIL1-qFzkJ79plH0seM4TsrTPdZoWakJVTH76-qmRpu6H6eaQt7U10R-Y8fn5N2FFh6XHRuDufEsDL8R2Tv7Cu0qbHKHTi-LgZcU2CxM22RyL6Df7Z0IpG5uEQqJ2LyxHJg3W-D3TgSNXUA8ge87ghGrhLRQ8hywH5gM4EZy9lKO7vMZml1IIfuyXTC8FU-HUn6-ZmvC1mADlAQJv84WHyg7fzzgNXqztvSyXA2p6jJG5FDgAjA9-yWnqJPxlZe7-Qi5Dj67lEF9kSII0tblV8JpxxJTpUvM2iPMLKWw77HDGaZkfAUu9WsbpQv-zWXPBBpbw

我們通過jwt.io解析出來。

第一部分Hrader

alg - 簽名演算法
kid - 金鑰的Id
typ - token型別

這三個引數是最常見的。d

第二部分PayLoad

nbf - 生效時間
exp - 過期時間
iss - 令牌發放者
chlien_Id - 發放客戶端id
aud - 令牌接收方
scope - 可訪問資源

在PayLoad中可以放置任何你想要的引數。

第三部分Signature

Signature 是對前兩部分的簽名,防止資料篡改。

JWT的認證過程

1.使用者使用賬號密碼或別的方式登陸
2.伺服器接受到登陸請求後生成一個jwt token
3.伺服器把jwt token返回給客戶端
4.客戶端在請求資源在Header中的authorization帶上jwt token
5.伺服器對jwt進行驗籤,驗籤成功後根據PayLoad中的資訊判斷認證是否通過
6.響應客戶端結果

授權方式-後面有實現的傳送門

Client Credentials - 客戶端授權模式。 - 實現傳送門
Resource Owner Password Credentials - 密碼模式。 - 實現傳送門
Implicit - 授權碼簡化模式。
Authorization Code - 授權碼模式。

總結

都是自己一邊學習IdentityServer4一邊寫,每種模式後都有實現傳的送門,文中如果有神馬錯誤請大佬們在評論區指出。