OpenID Connect發現端點的客戶端庫做爲httpclient的擴展方法提供。該GetDiscoveryDocumentAsync
方法返回一個DiscoveryResponse
對象,該對象具備發現文檔的各類元素的強類型和弱類型訪問器。html
在訪問文檔內容以前,應始終檢查IsError
和Error
屬性。git
例:github
var client = new HttpClient(); var disco = await client.GetDiscoveryDocumentAsync("https://demo.identityserver.io"); if (disco.IsError) throw new Exception(disco.Error);
能夠使用如下屬性訪問標準元素:c#
var tokenEndpoint = disco.TokenEndpoint; var keys = disco.KeySet.Keys;
自定義元素(或標準屬性未涵蓋的元素)能夠像這樣訪問:緩存
// returns string or null var stringValue = disco.TryGetString("some_string_element"); // return a nullable boolean var boolValue = disco.TryGetBoolean("some_boolean_element"); // return array (maybe empty) var arrayValue = disco.TryGetStringArray("some_array_element"); // returns JToken var rawJson = disco.TryGetValue("some_element);
默認狀況下,發現響應在返回到客戶端以前已通過驗證,驗證包括:服務器
能夠使用DiscoveryPolicy
類修改全部標準驗證規則,例如禁用頒發者名稱檢查:ide
var disco = await client.GetDiscoveryDocumentAsync(new DiscoveryDocumentRequest { Address = "https://demo.identityserver.io", Policy = { ValidateIssuerName = false } });
策略衝突錯誤會將DiscoveryResponse
上的ErrorType
屬性設置爲PolicyViolation
。函數
您應該按期更新發現文檔的本地副本,以便可以對服務器上的配置更改做出響應。這對於使用自動旋轉鍵進行良好的播放尤爲重要。ui
該DiscoveryCache
類能夠幫助你。.net
如下代碼將設置緩存,在第一次須要時檢索文檔,而後將其緩存24小時:
var cache = new DiscoveryCache("https://demo.identityserver.io");
而後,您能夠像這樣訪問文檔:
var disco = await cache.GetAsync(); if (disco.IsError) throw new Exception(disco.Error);
您能夠使用該CacheDuration
屬性指定緩存持續時間,也能夠經過將DiscoveryPolicy
傳遞給構造函數來指定自定義發現策略。
默認狀況下,發現緩存將在HttpClient
每次訪問發現端點時建立新實例。您能夠經過兩種方式修改此行爲,方法是將預先建立的實例傳入構造函數,或者經過提供將HttpClient
在須要時返回的函數。
如下代碼將在DI中設置發現緩存,並將使用HttpClientFactory
以建立客戶端:
services.AddSingleton<IDiscoveryCache>(r => { var factory = r.GetRequiredService<IHttpClientFactory>(); return new DiscoveryCache(Constants.Authority, () => factory.CreateClient()); });