最近也研究了一段時間的IdentityServer4,園裏關於IdentityServer的文章也不少,這裏也簡單寫寫,作作記錄(文筆不佳,見諒)。前端
1.identityserver是什麼?git
Identityserver是一個OpenID Connect和OAuth 2.0框架。它實現了這兩種協議流程,也提供了客戶端以便於集成。(基本上OpenID Connect和OAuth 2.0部分代碼是沒法更改的,裏面的endpoint相關代碼都是內部類)github
Identityserver也支持自定義協議,你能夠本身添加一個本身的驗證受權流程,不過須要寫不少代碼,官網提供了一個WsFederation協議的例子。json
Identityserver支持如下幾種模式,也能夠本身自定義模式:後端
Implicit(隱式受權模式):隱式受權類型針對基於瀏覽器的應用程序進行了優化。僅用於用戶身份驗證(服務器端和JavaScript應用程序),或身份驗證和訪問令牌請求(JavaScript應用程序)。不支持刷新token,簡單來講就是一系列受權和用戶登陸的流程。對應的模式是混合模式。api
Authorization code(受權碼模式):獲取受權碼,再經過受權碼獲取accesstoken和refreshtoken瀏覽器
Hybrid(混合模式):混合流是隱式和受權代碼流的組合。支持刷新token。服務器
Client credentials(客戶端認證模式):經過客戶端id和祕鑰獲取tokencookie
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,微博等。