IdentityServer4实战 - JWT Token Issuer 详解

一.前言

本文为系列补坑之作,拖了许久决定先把坑填完。

下文演示所用代码采用的 IdentityServer4 版本为 2.3.0,由于时间推移可能以后的版本会有一些改动,请参考查看,文末附上Demo代码。

本文所诉Token如无特殊说明皆为 JWT Token。

众所周知 JWT Token 由三部分组成,第一部分 Header,包含 keyid、签名算法、Token类型;第二部分 Payload 包含 Token 的信息主体,如授权时间、过期时间、颁发者、身份唯一标识等等;第三部分是Token的签名。我们对一个 Token 进行解码,观察其中 Payload 部分,你将会发现一个 "iss" 字段,那么它代表什么呢,它又有什么作用呢,请看后文分解。

640?wx_fmt=png

二. Issuer 的前世今生

iss 是 OpenId Connect(后文简称OIDC)协议中定义的一个字段,其全称为 “Issuer Identifier”,中文意思就是:颁发者身份标识,表示 Token 颁发者的唯一标识,一般是一个 http(s) url,如 https://www.baidu.com

在 Token 的验证过程中,会将它作为验证的一个阶段,如无法匹配将会造成验证失败,最后返回 HTTP 401。

三. Issuer 的验证流程分析

JWT的验证是去中心化的验证,实际这个验证过程是发生在API资源的,除了必要的从 IdentityServer4 获取元数据(获取后会缓存,不用重复获取)比如获取公钥用于验证签名,是不会再去交互的(详细介绍:https://www.cnblogs.com/stulzq/p/9226059.html)。那么我们就从 API 资源作为入口开始分析。

我们在 API 资源的配置认证的代码如下:

640?wx_fmt=png

一个携带 Token 的请求从认证中间件到最终验证 Issuer 的逻辑如下图(懒得画流程图了,直接做个gif)。请看原文

最终验证 Issuer 的代码:

640?wx_fmt=png

由源码分析可以获得几个结论:

1.验证 Token 必定会验证 Issuer,如果 Issuer 验证失败,那么表示则整个 Token 的验证结果就是失败。

  1. Issuer 默认从 IdentityServer4 的 Discovery Endpoint(/.well-known/openid-configuration)获取Issuer

640?wx_fmt=png

3.Issuer 可以自定义,并且可以设置一个列表,如果手动设置了会覆盖默认值

4.Issuer 验证逻辑默认只验证是否相等,即 Token 携带的 Issuer 是否与 设置的 Issuer 值相等。

5.Issuer 验证逻辑可以自定义

6.Issuer 的验证可以关闭

以上设置如无特殊需求直接使用默认值即可,不需要额外设置。

关于以上结论的在代码(API资源)中的实现:

640?wx_fmt=png

四.如何设置 Token 的 Issuer

第三节讲的是 Issuer 验证时有效 Issuer 的设置,本节讲的是 设置 Token 的 Issuer,Token携带的 Issuer 与API资源设置的有效 Issuer 进行验证匹配完成整个流程,这里提一下,避免搞混。

设置 Token 的 Issuer 需要在 IdentityServer4 设置。在 Startup 里中设置:

services.AddIdentityServer(option=>option.IssuerUri="https://www.baidu.com")

此值必须是一个 http(s) url。

验证是否生效:

1.访问 Discovery Endpoint(/.well-known/openid-configuration)

640?wx_fmt=png

2.对Token解码,查看 iss 字段

如果在 IdentityServer4 设置此值,默认情况下所有API资源都会获取此值作为默认有效Issuer。

如果你自定义了 Issuer,在使用 Client 访问时会出现 Issuer 与 Authority 不匹配的错误,是因为Client在默认情况下作了限制,关闭即可:

var client = new HttpClient();var disco = await client.GetDiscoveryDocumentAsync(new DiscoveryDocumentRequest(){Address = "http://localhost:5000" ,Policy = new DiscoveryPolicy(){ValidateIssuerName = false}});

五.默认值问题

如果没有手动设置 IdentityServer4 IssuerUri 值那么它默认会取你访问 IdentityServer4 时的 Host,下面举例说明。

首先修改 IdentityServer4 项目的监听地址,使其能够通过局域网IP访问

640?wx_fmt=png

然后分别通过 localhost 和 局域网ip 访问 Discovery Endpoint,观察 Issuer 的值:

localhost:

640?wx_fmt=png

局域网IP:

640?wx_fmt=png

看出差异了吧,这一点需要注意,下一节将会讲一下这个引发的问题。

六.Issuer 默认值问题可能出现的场景及解决

这种情况一般出现在 IdentityServer4 经过了一层或多层代理,比如 Nginx反代、网关等,外网地址经过代理传递到了 IdentityServer4,如果直接通过外网请求的 Token Endpoint(/connect/token) 生成的 Token,那么这个 Token 携带的 iss 地址将会是外网地址(正常情况下,Host是会经过代理传过来的,如果你不配置传过来,那么就没有这个问题,那么你的后端服务获取的地址与预期肯定有差别,不推荐这种做法)。但是本地API资源(与IdentityServer4在同一台服务器或者同一个局域网)与IdentityServer4交互的地址(Authority)肯定会配成localhost 或者是局域网地址(如果你这里配置成外网地址,那么你可以不继续往下看了,内部交互还要走外部网络严重不推荐甚至是禁止此种做法)。

640?wx_fmt=png

上图的架构即便是把 Gateway、IdentityServer、Basket服务(API资源)放在一台机器上也是一样的道理,都会出现这种情况,其原因就是如果 IdentityServer 不设置 Issuer,就会取你访问IdentityServer时的Host作为Issuer,外网进来的Host地址和你内部交互的不一样就造成了这个问题,解决办法就是在 IdentityServer 手动指定一个 Issuer 即可解决(第四节),取消掉它的默认取Host的机制,不管你怎么访问IdentityServer返回的Issuer都是一个地址。

七.结束

Demo:

https://github.com/stulzq/IdentityServer4.Samples/tree/master/Practice/03_Issuer

参考资料:

OIDC(OpenId Connect)身份认证授权(核心部分) by blackheart.

原文地址:https://www.cnblogs.com/stulzq/p/10339024.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P3834 【模板】可持久化线段树 2(整体二分做法)

P3834 【模板】可持久化线段树 2(主席树) 我们详细讲讲这个整体二分如何求区间第k小 我们都知道二分可以求出区间里某个想要的值,如果有很多询问,我们对每个询问都进行二分,复杂度就是O(QNlog(1e9))铁超,那…

胡浩:人人能学的AI《从零开始机器学习》苏州.NET俱乐部课程分享

【课程名称】《从零开始机器学XI》【老师介绍】胡浩,微软最有价值专家(MVP,十余届多方向),微软技术大会讲师。云、数据中心基础架构、全栈虚拟化、企业移动管理等领域的架构师及顾问。AI/ML等新技术的爱好者&#xff0…

IdentityServer4实战 - 与API单项目整合

一.前言我们在实际使用 IdentityServer4 的时候,可能会在使用 IdentityServer4 项目添加一些API,比如 找回密码、用户注册、修改用户资料等,这些API与IdentityServer4怎么共存在一个项目呢?二.整合1.首先在 Startup.cs 中添加 Ide…

[HDU 6157]The Karting(DP)

[HDU 6157]The Karting description solution 先用前缀和求出di:1→id_i:1\rightarrow idi​:1→i 的距离 前缀和满足:若在iii点进行方向改变,则iii产生的贡献是一定的,可以先累计贡献 也就是说真正的路径怎么走,我们是不关心…

.NET 开源简史

现在在微软开发开源软件是很一件正常的事情——但在 2007 年,当时我刚加入微软,那时候可不是这么一回事。微软花了好几年时间才找到正确的方向,让微软这艘大船顺着开源之风向前航行。现在回头远望过去那些曾经面临的挑战,我们一笑…

P2617 Dynamic Rankings(整体二分)

P2617 Dynamic Rankings 题意: 待修改的区间最值问题 题解: 整体二分天然带有修改性 整体二分做不带修改的区间最值—>看这里 现在待修改,我们可以将第l位修改为x,因为我们是用树状数组来维护的,所以把这个过程拆分成将第l个…

[LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相(树的重心+贪心)

[LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相 description solution 一个到所有节点距离和最小的节点 ⇔\Leftrightarrow⇔ 树的重心(满足最重的儿子最轻,每个儿子siz≤n2\le\frac{n}{2}≤2n​) 显然原树的重心答案为0 对于点iii&am…

由优劣语言之争引起的思考

由优劣语言之争引起的思考#欲使其灭亡,必使其疯狂昨天上午由阿里云中间件公众号和架构师小秘圈公众号发布的一篇文章《天天敲代码会使人变聪明么》在.net开发者中掀起了一阵巨浪,文章中提到的语言的先进与落后之争让基于.net开发者们义愤填膺&#xff0c…

[LOJ #521]「LibreOJ β Round #3」绯色 IOI(抵达)(结论)

#521. 「LibreOJ β Round #3」绯色 IOI(抵达) description solution 因为点的庇护所不能为自身,题目背景在树上,有结论一定是两个相邻点互为庇护所 所以树一定要能两两完美匹配才有解 判断完有解后就是构造解了,…

微软是如何使用 C# 重写 C# 编译器并将其开源的

Roslyn 是 C# 和 Visual Basic.NET 开源编译器的代号。这篇文章将介绍它是如何从微软过去的十年至暗时刻走出来,成为开源跨平台的 C# 和 VB 公共语言引擎。我于 2005 年加入微软,也就是在.NET 2.0 发布之前,当时微软内部已经开始在讨论 Rosly…

P3332 [ZJOI2013]K大数查询(整体二分做法)

P3332 [ZJOI2013]K大数查询 题意: 题解: 利用整体二分来做,这个题和P3834 【模板】可持久化线段树 2的区别在于本题的修改是区间修改,所以将里面的树状数组改成线段树就行,区间修改区间查询 但是不知道为什么我调了一阵子也不对…

[APIO2020]交换城市(交互+kruskal重构树)

[APIO2020]交换城市 description solution 如果u,vu,vu,v存在于一条链上(只有两个点度数为111其余点度数为222)则无解,否则必有解 如图,不管是哪个点度数>2>2>2,都可以有解 以蓝色为例,第二个…

如何在ASP.NET Core程序启动时运行异步任务(1)

原文:Running async tasks on app startup in ASP.NET Core (Part 1)作者:Andrew Lock译者:Lamond Lu背景当我们做项目的时候,有时候希望自己的ASP.NET Core应用在启动前执行一些初始化逻辑。例如,你希望验证配置是否合…

扫描线讲解

参考文章: 线段树扫描线(有关扫描线的理解) 线段树扫描线(基本原理) 扫描线 第二个文章里面的图很生动: 我总结一下就是:将所给图形的横坐标全部记录,纵坐标记录为扫描线 然后对与…

梁迪:我为MVP骄傲,《微软最有价值专家奖励计划介绍》附专题视频

题记:有些事情,比 MVP 更加不朽,浩气长空,日月星汉,我们为 MVP 和那些心目中的“MVP”感到骄傲。微软 MVP 是一种追求,不必要去强求,但 MVP 必定是俱乐部发展的根基础。火车跑得快全凭车头带&am…

P3295 [SCOI2016]萌萌哒(DP+倍增)

P3295 [SCOI2016]萌萌哒 description solution 强制部分区间相同,很容易就想到了并查集,直接暴力并查集合并是O(n2)O(n^2)O(n2)的 只需要考虑那一个数据结构将其转化成O(nlog⁡n)O(n\log n)O(nlogn)的 树之类的就不考虑了,一段一段的区间…

【恭贺新春】2019年春节放假

2019年放假通知致全体微友: 2019年2月5日(正月初一)至2月8日(正月初四)春节放假,共4天,小编停止更新公众号信息。敬请相互转告。值此新春佳节到来之际,“dotNet跨平台”给大家拜个…

C - Insertion Sort Gym - 101955C

C - Insertion Sort Gym - 101955C 题意: t组数据,每组数据给你n,k,q,让你求存在多少合法的1~n排列 合法要求: 对排列的前k项进行排序,使得整个序列中最长的递增子序列长度为n-1 题解&#x…

华为云.NET Core支持情况调查

各大公有云都提供了开发者开发的SDK,今天我们来看看华为云对.NET Core的支持情况怎么样? .NET SDK地址 https://developer.huaweicloud.com/sdk#.NET华为云的.NET SDK相比其他语言少的可伶,而且这几个SDK还不支持.NET Core。SDK的支持实在太差…

[2021-07-19 内测NOIP] 操作(状压DP),异或(字典树),等级(线段树),矩阵(DP)

[2021-07-19 内测] NOIP操作descriptionsolutioncode异或descriptionsolutioncode等级descriptionsolutioncode矩阵descriptionsolutioncode操作 description 有n堆石子,每堆石子都有一定的数量,第i堆石子的数量用Ai表示。 任意两堆石子均可合并&…