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()); });