微软MVP精选 |从TCP/IP协议出发,详细分析Ids4认证过程

柯里蝉翼
• 阅读 1709

微软MVP精选 |从TCP/IP协议出发,详细分析Ids4认证过程

只要贡献,就不分大小,每个人都是这个时代最璀璨的星!
一个以开源项目主导的社区组织。

BCVP框架,是基于:
ASP.NETCore5.0+VUE.js+IdentityServer4等核心技术,实现的前后端分离与动态认证鉴权一体化平台。已经正式运行两年,是一套很成熟的框架了。但是中间一直有一个很小的核心问题,我一直没有机会去证实,今天终于有机会求证一下,这里感谢@wuare老铁,提供技术支持——后端服务抓包与服务协议分析。
先简单说下故事背景:
关于认证授权流程,也就是OAuth2.0协议的过程,当我们的客户端(Vue)向资源服务器(core)发起请求的时候,先判断Token是否有效,如果为空或无效,便直接401驳回。如果正常的话,就会向认证中心(ids4)发起校验请求,通过后,剩下的就正常访问了。
那么问题来了:

Q&A:
1、上边绿色的校验请求,是每次都请求么?
2、请求的接口和返回内容是什么?
3、如果我关闭认证中心,访问还能正常继续么?

不知道你是否有这些疑问,如果已经有了准确的答案,欢迎指出本文的问题;如果不太清楚,本文正好帮你好好理解一下。
因为毕竟是资源服务器向认证中心发起的后端之间的请求,所以需要抓包工具来查看具体的内容,这里推荐Wireshark,网络管理员会使用wireshark来检查网络问题。
安装过程很简单,这里忽略不表,有一点需要注意,如果要调试本地localhost的访问请求,需要另外安装一个工具——NMap,配合WireShark一起使用。
安装完成后,可以看到主要界面是这样的:
微软MVP精选 |从TCP/IP协议出发,详细分析Ids4认证过程

主要分成三块:分别是过滤器,请求区,5层顺序结果区。
如何来验证我们文章开头的问题呢,别着急,在求证之前,先来回顾下计算机网络相关知识。

计算机网络分层基础

计算机网络请求,经典五层结构模型:
微软MVP精选 |从TCP/IP协议出发,详细分析Ids4认证过程

再详细说每次是干什么的呢:
微软MVP精选 |从TCP/IP协议出发,详细分析Ids4认证过程

现在我们看到的很多的,都是在之前的五层结构上,把应用层细分了,最终是拆分的七层模型,最后我们来一张详细的图来说明各层的情况:
微软MVP精选 |从TCP/IP协议出发,详细分析Ids4认证过程

这个时候是不是都要大呼表示看不懂了,没关系!只需要知道五层的名字,以及每层都是干啥的都行啦。
随便访问一个Http请求,用WireShark查看具体的访问过程,可以清晰的看到五层结构和执行顺序:
微软MVP精选 |从TCP/IP协议出发,详细分析Ids4认证过程

不过,还是建议重点了解下传输层和网络层,应用层不用了解,因为我们天天干的活就是应用层的。
如果你传输层不了解,那TCP三次握手,你肯定都知道吧,它就发生在传输层,因为从单词上就可以看出来:Transmission Control Protocol。
那好,我们就来看看三次握手的过程,如何在WireShark中体现

TCP三次握手过程

我们可以通过PostMan发送一次请求,请尽量请求最近没有建立链接的请求,比如我的http://tibug.neters.club
然后在WireShark中,可以看到请求过程,可以做个过滤,不然太多了:
微软MVP精选 |从TCP/IP协议出发,详细分析Ids4认证过程
我们简单的分析下三次握手过程:

第一次握手数据包 客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。
第二次握手的数据包 服务器发回确认包,标志位为 SYN,ACK。将确认序号(Acknowledgement Number)设置为客户的ISN加1,即0+1=1
第三次握手的数据包 客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1。并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方。
是不是整体看起来清晰明了!
有了网络知识,有了工具加持,现在我们可以开始研究文章开头提出的问题了

资源服务器“首次”发起请求

我在标题里,重点加上了首次,到底是不是首次,正好验证一下:
首先在Blog.Core项目中,开启Ids4认证模式:
微软MVP精选 |从TCP/IP协议出发,详细分析Ids4认证过程
然后分别运行两个项目,先获取Token,然后发送一个获取菜单接口请求,第一次的请求结果是这样的,可以在过滤器里,写上http,做一个过滤:
微软MVP精选 |从TCP/IP协议出发,详细分析Ids4认证过程
整体流程很简单,先请求资源服务,然后调用认证中心,发起两次接口,结果分别是:
1、/.well-known/openid-configuration
微软MVP精选 |从TCP/IP协议出发,详细分析Ids4认证过程
2、/.well-known/openid-configuration/jwks
微软MVP精选 |从TCP/IP协议出发,详细分析Ids4认证过程

这些结果都被放到了资源服务器的内存当中,供以后调用,如果你想看具体的结构和结果,可以直接将返回结果复制出来:
微软MVP精选 |从TCP/IP协议出发,详细分析Ids4认证过程
到这里,文章前两个问题已经完美得到了答案。
开始验证第三个问题吧,关掉认证中心服务即可!

资源服务器“再次”发起请求

需在上一节的基础上,停掉认证中心服务,但是不要重启资源服务,还是之前的令牌,换一个新的接口/api/Permission/Get,当然不换也可以,发起请求:
微软MVP精选 |从TCP/IP协议出发,详细分析Ids4认证过程
果不其然,请求照样可以走通,而且也没有发起认证了,是从上一步的内存中,直接获取,并做后续逻辑。
到这里,已经完美解决了文章开头的三个问题,顺便也学会了抓包和计算机网络知识,加油!

微软最有价值专家是微软公司授予第三方技术专业人士的一个全球奖项。27年来,世界各地的技术社区领导者,因其在线上和线下的技术社区中分享专业知识和经验而获得此奖项。


MVP是经过严格挑选的专家团队,他们代表着技术最精湛且最具智慧的人,是对社区投入极大的热情并乐于助人的专家。MVP致力于通过演讲、论坛问答、创建网站、撰写博客、分享视频、开源项目、组织会议等方式来帮助他人,并最大程度地帮助微软技术社区用户使用Microsoft技术。
更多详情请登录官方网站:

https://mvp.microsoft.com/zh-cn
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Easter79 Easter79
3年前
typeScript数据类型
//布尔类型letisDone:booleanfalse;//数字类型所有数字都是浮点数numberletdecLiteral:number6;lethexLiteral:number0xf00d;letbinaryLiteral:number0b101
梦
4年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
MBR笔记
<bochs:100000000000e\WGUI\Simclientsize(0,0)!stretchedsize(640,480)!<bochs:2b0x7c00<bochs:3c00000003740i\BIOS\$Revision:1.166$$Date:2006/08/1117
Wesley13 Wesley13
3年前
34.TCP取样器
阅读文本大概需要3分钟。1、TCP取样器的作用   TCP取样器作用就是通过TCP/IP协议来连接服务器,然后发送数据和接收数据。2、TCP取样器详解!(https://oscimg.oschina.net/oscnet/32a9b19ba1db00f321d22a0f33bcfb68a0d.png)TCPClien
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这