天天看點

ids4-startup

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