• 第1章 发现端点(Discovery Endpoint)


    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地址

  • 相关阅读:
    CentOS7.2安装mysql
    中国古代研究
    2018计算机考研各科试卷分值分布
    《期刊杂志总结》
    《认识雅思》
    《认识托福》
    Java框架
    英语学习方法
    单词2
    Phaser游戏框架与HTML Dom元素之间的通信交互
  • 原文地址:https://www.cnblogs.com/thinksjay/p/10787616.html
Copyright © 2020-2023  润新知