https://stackoverflow.com/questions/28418360/jwt-json-web-token-audience-aud-versus-client-id-whats-the-difference
本篇隻聚焦ids的啟動配置的流程以及關聯的核心接口和類,對應官方文檔https://identityserver4.readthedocs.io/en/latest/topics/startup.html
啟動配置宏觀上說做了兩件事:注冊ids運作過程中需要使用到的相關服務、注冊ids終結點中間件
注冊服務
在startup中
public void ConfigureServices(IServiceCollection services)
{
var builder = services.AddIdentityServer();
}
- ids中定義了很多接口,以實作可擴充性,這些接口都有預設實作,通常預設實作還配有對應的option對象,這些接口、實作和對應的option都在這裡注冊到ioc容器
- 大部分情況下我們在這裡對各元件的option對象進行配置就可以了
- 特殊情況下我們需要自定義實作某些接口,然後在這裡替換ids注冊的接口實作
Token驗證器ITokenValidator
它提供對AccessToken和IdentityToken的驗證的兩個方法,預設實作:TokenValidator
這倆方法都會用到IKeyMaterialService.GetValidationKeysAsync
驗證過程中會使用到key材料,這個key材料的管理由IKeyMaterialService提供,啥是key材料?往後看
密鑰材料管理服務IKeyMaterialService
ids4運作過程中會使用到各種密鑰,比如token的加解密,jwt簽名驗證等,這些密碼在ids稱為 key材料。可以簡單了解為:key材料 = 密鑰 + 簽名算法
主要又分為兩種key材料:SigningCredential、ValidationKeys,前者主要是各種地方的簽名用(經過檢視源碼隻是用來生成各種hash值),後者隻是用來加解密token的,上面說了就是identityToken和accessToken
由于簽名是比較簡單的邏輯,是以不想token的處理還專門定義了token驗證器,所有需要簽名的地方是直接引用IKeyMaterialService的
由IKeyMaterialService統一管理密鑰,預設實作類是DefaultKeyMaterialService,它隻是提供密鑰的業務邏輯管理
密鑰的存儲時通過對應IStorage提供的,SigningCredential、ValidationKeys分别有自己的Storage
中間件的執行
EndPointRouter 路由找到EndPoint,并執行它,
請求code
通過code請求accessToken
登出等 都是不同的endpoint
public void ConfigureServices(IServiceCollection services)
{
var builder = services.AddIdentityServer();
}
ids運作過程中需要的服務由這個方法統一注冊,具體注冊了哪些核心服務後面再慢慢補充
key材料
所謂的key材料 = 密鑰 + 加密算法
AddSigningCredential
生成token時會使用這裡的密鑰資訊進行加密,猜想請求identity資源和api資源時驗證token時也會使用到這個密鑰。
AddDeveloperSigningCredential
開發時在根目錄中建立的零時密鑰
AddValidationKey
在jwttoken驗證簽名時會使用到的密鑰,通過源碼查用戶端登出時會去請求ids4伺服器,會攜帶參數,那些參數的驗證簽名也是用的這個
In-Memory configuration stores
啟動階段從寫死、配置、資料庫擷取api資源、identity資源、client配置。這個其實也可以用于生産環境
AddInMemoryClients AddInMemoryIdentityResources AddInMemoryApiResources
Test stores
AddTestUsers 這個通常就不建議在生産環境使用了
Additional services
ids4中間件處理過程中會使用到各種服務,而這些服務就是擴充點,很多都可以替換
AddExtensionGrantValidator
TokenEndpoint負責處理code的擷取accesstoken identitytoken的擷取,其中一個重要的步驟就是驗證請求,會根據不太的授權模式,如:AuthorizationCode、ClientCredentials、Password、RefreshToken做不同的授權檢查,AddExtensionGrantValidator就是表示不屬于以上類型的自定義授權類型,是以可以通過自定義的授權檢查器來實作更多的授權流程
AddSecretParser
機密解析器,總的來說就是從請求中解析得到機密資訊,提取到的結果用ParsedSecret表示。比如從請求中擷取clientid,securet等資訊
AddSecretValidator
上面得到client資訊,下面就是驗證,設計方式與上面類型
AddResourceOwnerValidator
資源所有者模式中用來驗證使用者密碼的
AddProfileService
添加用于連接配接到自定義使用者配置檔案存儲的IProfileService實作。 擷取使用者Profile時調用的,預設實作DefaultProfileService是直接從身份驗證的cookie中擷取申明然後響應給使用者
AddAuthorizeInteractionResponseGenerator
使用者登陸階段調用它來決定向使用者顯示什麼,需要登陸?需要确認?需要跳轉?
用支付寶掃一掃,咱倆都可以獲得一個小紅包
關注我的今日頭條,有不錯的c#.net經驗分享
本文來自部落格園,作者:變形精怪,轉載請注明原文連結:https://www.cnblogs.com/jionsoft/p/13499783.html