第1章 发现端点(Discovery Endpoint) - IdentityModel 中文文档(v1.0.0)
程序员文章站
2022-07-11 08:35:03
"OpenID Connect发现端点" 的客户端库作为httpclient的扩展方法提供。该 方法返回一个 对象,该对象具有发现文档的各种元素的强类型和弱类型访问器。 在访问文档内容之前,应始终检查 和`Error`属性。 例: 可以使用以下属性访问标准元素: 自定义元素(或标准属性未涵盖的元素) ......
openid connect发现端点的客户端库作为httpclient的扩展方法提供。该getdiscoverydocumentasync
方法返回一个discoveryresponse
对象,该对象具有发现文档的各种元素的强类型和弱类型访问器。
在访问文档内容之前,应始终检查iserror
和error
属性。
例:
var client = new httpclient(); var disco = await client.getdiscoverydocumentasync("https://demo.identityserver.io"); if (disco.iserror) throw new exception(disco.error);
可以使用以下属性访问标准元素:
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);
1.1 发现政策
默认情况下,发现响应在返回到客户端之前已经过验证,验证包括:
- 强制使用https(localhost地址除外)
- 强制发行人与当局匹配
- 强制协议端点与权限位于同一dns名称上
- 强制执行密钥集的存在
可以使用discoverypolicy
类修改所有标准验证规则,例如禁用颁发者名称检查:
var disco = await client.getdiscoverydocumentasync(new discoverydocumentrequest { address = "https://demo.identityserver.io", policy = { validateissuername = false } });
策略冲突错误会将discoveryresponse
上的errortype
属性设置为policyviolation
。
1.2 缓存发现文档
您应该定期更新发现文档的本地副本,以便能够对服务器上的配置更改作出响应。这对于使用自动旋转键进行良好的播放尤其重要。
该discoverycache
类可以帮助你。
以下代码将设置缓存,在第一次需要时检索文档,然后将其缓存24小时:
var cache = new discoverycache("https://demo.identityserver.io");
然后,您可以像这样访问文档:
var disco = await cache.getasync(); if (disco.iserror) throw new exception(disco.error);
您可以使用该cacheduration
属性指定缓存持续时间,也可以通过将discoverypolicy
传递给构造函数来指定自定义发现策略。
1.2.1 缓存和httpclient实例
默认情况下,发现缓存将在httpclient
每次访问发现端点时创建新实例。您可以通过两种方式修改此行为,方法是将预先创建的实例传入构造函数,或者通过提供将httpclient
在需要时返回的函数。
以下代码将在di中设置发现缓存,并将使用httpclientfactory
以创建客户端:
services.addsingleton<idiscoverycache>(r => { var factory = r.getrequiredservice<ihttpclientfactory>(); return new discoverycache(constants.authority, () => factory.createclient()); });