最近也研究了一段時間的IdentityServer4,園裡關於IdentityServer的文章也很多,這裡也簡單寫寫,做做記錄(文筆不佳,見諒)。 1.identityserver是什麼? Identityserver是一個OpenID Connect和OAuth 2.0框架。它實現了這兩種協議流 ...
最近也研究了一段時間的IdentityServer4,園裡關於IdentityServer的文章也很多,這裡也簡單寫寫,做做記錄(文筆不佳,見諒)。
1.identityserver是什麼?
Identityserver是一個OpenID Connect和OAuth 2.0框架。它實現了這兩種協議流程,也提供了客戶端以便於集成。(基本上OpenID Connect和OAuth 2.0部分代碼是無法更改的,裡面的endpoint相關代碼都是內部類)
Identityserver也支持自定義協議,你可以自己添加一個自己的驗證授權流程,不過需要寫很多代碼,官網提供了一個WsFederation協議的例子。
Identityserver支持以下幾種模式,也可以自己自定義模式:
Implicit(隱式授權模式):隱式授權類型針對基於瀏覽器的應用程式進行了優化。僅用於用戶身份驗證(伺服器端和JavaScript應用程式),或身份驗證和訪問令牌請求(JavaScript應用程式)。不支持刷新token,簡單來說就是一系列授權和用戶登錄的流程。對應的模式是混合模式。
Authorization code(授權碼模式):獲取授權碼,再通過授權碼獲取accesstoken和refreshtoken
Hybrid(混合模式):混合流是隱式和授權代碼流的組合。支持刷新token。
Client credentials(客戶端認證模式):通過客戶端id和秘鑰獲取token
Resource owner password(用戶名密碼模式):使用用戶名密碼獲取token
Refresh tokens(刷新token模式):使用刷新token獲取新的accesstoken和刷新token
上各種模式的最終目的都是獲取授權,例如Idtoken(包含用戶信息,JWT格式),accesstoken,accesstoken包含了用戶授權的信息,例如允許訪問哪些api等。
2.Identityserver能做什麼
單點登錄:我一開始接觸identityserver就是為了實現單點登錄,一般使用Implicit(隱式授權模式)或者 Hybrid(混合模式)實現單點登錄。
Implicit流程如下:
登錄:
用戶在客戶端網站1通過客戶端id和秘鑰等信息訪問identityserver,驗證通過後跳轉到登錄頁面,輸入用戶名密碼正確會返回idtoken,客戶端網站1通過解密獲取用戶信息並存儲cookie(第一次登錄)
客戶端網站2通過客戶端id和秘鑰等信息訪問identityserver,發現用戶已認證(identityserver網站存儲了cookie),客戶端網站2通過解密獲取用戶信息並存儲cookie(第二次登錄)
登出:
用戶通過客戶端網站1訪問Identityserver的結束會話端點,需要id_token_hint和post_logout_redirect_uri參數,Identityserver清除會話信息(cookie),並會回調所有登錄客戶端的FrontChannelLogout(前端註銷)和BackChannelLogout(後端註銷)地址,
接著跳轉到網站1的post_logout_redirect_uri地址。
ps:通過identityserver實現的單點登錄必須每個網站驗證都需要跳轉到identityserver,若要實現一次登錄所有網站都登錄的模式(jsonp實現單點登錄),只能再通過一個子網站作為中轉。
認證服務:適用於各種客戶端集中登錄邏輯和工作流程。單點登錄就是其中一種實現。
API訪問控制:一種是基於客戶端的訪問,一種是基於用戶的訪問,都是通過Identityserver獲取accesstoken(accesstoken有api的授權),獲取的時候需要包含允許訪問的api參數,然後就可以通過accesstoken訪問api了。
ps:api也是需要自己新建的,接入identityserver驗證或者bear認證就可以了。
接入第三方授權訪問:例如google,facebook,qq,微博等。