OpenID Connect发现端点的客户端库作为httpclient的扩展方法提供。该GetDiscoveryDocumentAsync方法返回一个DiscoveryResponse对象,该对象具有发现文档的各种元素的强类型和弱类型访问器。

在访问文档内容之前,应始终检查IsErrorError属性。

例:

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

github地址

第1章 发现端点(Discovery Endpoint) - IdentityModel 中文文档(v1.0.0)的更多相关文章

  1. 第7章 UserInfo端点(UserInfo Endpoint) - IdentityModel 中文文档(v1.0.0)

    OpenID Connect UserInfo端点的客户端库是作为扩展HttpClient方法提供的. 以下代码将访问令牌发送到UserInfo端点: var client = new HttpCli ...

  2. 第2章 授权端点(Authorize Endpoint) - IdentityModel 中文文档(v1.0.0)

    对于大多数情况,OAuth 2.0和OpenID Connect授权端点的GET请求需要具有许多查询字符串参数. 虽然您可以使用任何方法创建带参数的URL来创建正确的字符串,但RequestUrl类是 ...

  3. 第4章 令牌端点(Token Endpoint) - IdentityModel 中文文档(v1.0.0)

    令牌端点的客户端库(OAuth 2.0和OpenID Connect)作为HttpClient一组扩展方法提供.这允许HttpClient以您喜欢的方式创建和管理生命周期- 例如静态或通过像Micro ...

  4. 第6章 令牌撤销端点(Token Revocation Endpoint) - IdentityModel 中文文档(v1.0.0)

    OAuth 2.0令牌撤销的客户端库是作为扩展方法提供的HttpClient. 以下代码撤消撤销端点处的访问令牌令牌: var client = new HttpClient(); var resul ...

  5. 第5章 令牌自省端点(Token Introspection Endpoint) - IdentityModel 中文文档(v1.0.0)

    OAuth 2.0令牌自省的客户端库是作为HttpClient扩展方法提供的. 以下代码将引用令牌发送到内省端点: var client = new HttpClient(); var respons ...

  6. 第9章 设备授权端点(Device Authorization Endpoint) - IdentityModel 中文文档(v1.0.0)

    OAuth 2.0设备流设备授权的客户端库是作为HttpClient扩展方法提供的. 以下代码发送设备授权请求: var client = new HttpClient(); var response ...

  7. 第3章 结束会话端点(EndSession Point) - IdentityModel 中文文档(v1.0.0)

    该RequestUrl类可用于构造URL发送到OpenID Connect EndSession endpoint. 该CreateEndSessionUrl扩展方法支持最常用的参数: /// < ...

  8. IdentityModel 中文文档(v1.0.0) 目录

    欢迎使用IdentityModel文档! 第一部分 协议客户端库 第1章 发现端点(Discovery Endpoint) 第2章 授权端点(Authorize Endpoint) 第3章 结束会话端 ...

  9. 第46章 发现端点(Discovery Endpoint) - Identity Server 4 中文文档(v1.0.0)

    发现端点可用于检索有关IdentityServer的元数据 - 它返回发布者名称,密钥材料,支持的范围等信息.有关详细信息,请参阅规范. 发现端点可通过/.well-known/openid-conf ...

随机推荐

  1. Java多线程:synchronized的可重入性

    从Java多线程:线程间通信之volatile与sychronized这篇文章中我们了解了synchronized的基本特性,知道了一旦有一个线程访问某个对象的synchronized修饰的方法或代码 ...

  2. ubuntu18.04安装搜狗拼音

    1.下载好搜狗安装包http://pinyin.sogou.com/linux/ ,注意位数! 2.打开终端安装依赖    sudo apt install libfcitx-qt0 3.提取下载好的 ...

  3. java读取.properties配置文件的几种方法

    读取.properties配置文件在实际的开发中使用的很多,总结了一下,有以下几种方法(仅仅是我知道的):一.通过jdk提供的java.util.Properties类.此类继承自java.util. ...

  4. win7 中如何设置eclipse的背景色--Console

    http://blog.csdn.net/u013161399/article/details/47297781

  5. jQuery-01:on live bind delegate

    摘自:https://www.cnblogs.com/moonreplace/archive/2012/10/09/2717136.html moonreplace这位大牛的 当我们试图绑定一些事件到 ...

  6. PiggyMetrics windows 部署

    PiggyMetrics 是springcloud的demo,其特性就不细说了,主要描述在win10下部署的坑. 官网是:https://github.com/sqshq/PiggyMetrics 官 ...

  7. OOP编程七大原则

    OCP(Open-Closed Principle),开放封闭原则:软件实体应该扩展开放.修改封闭.实现:合理划分构件,一种可变性不应当散落在代码的很多角落里,而应当被封装到一个对象里:一种可变性不应 ...

  8. 在不重装系统的情况下创建Linux的Swap分区

    本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=649 操作环境: CentOS 7 操作背景: 本文中使用的CentOS Linux系统在安装的时候没有创建Swap ...

  9. Python定时任务

    在项目中,我们可能遇到有定时任务的需求.其一:定时执行任务.例如每天早上 8 点定时推送早报.其二:每隔一个时间段就执行任务.比如:每隔一个小时提醒自己起来走动走动,避免长时间坐着.今天,我跟大家分享 ...

  10. Maven常识

    maven下面通常有四个文件夹: src/main/java -- 用来存放业务代码 src/test/java -- 用来存放测试代码 另有两个名为resource的文件夹,通常用来放置前两个文件夹 ...