热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

ASP.NETCore实现JWT授权与认证(1.理论篇)

1.授权与认证的作用1.1.资源保护网络资源保护机制是一个鲜为人知的基本措施,比如我们会对网络相册设置密码并指定部分用户才可访问,又比如我们网盘的资源分享时设置的访问密码等等措施。

1.授权与认证的作用


1.1.资源保护

网络资源保护机制是一个鲜为人知的基本措施,比如我们会对网络相册设置密码并指定部分用户才可访问,又比如我们网盘的资源分享时设置的访问密码等等措施。这种资源保护的机制不光体现于此,作为软件从业人员对于我们开发的API的访问也是有一套保护机制的,那么对应到API的保护机制,也就是实现了一套完整的授权与认证体系,这也是基本的API接口标准。

 

实现了授权与认证的API有以下的防护作用:


1.2.传统授权

在我们传统的单机服务器架构模式中(应用程序只部署在一台服务器上),大多数Web应用都采用的是一种Seesion的身份验证方式。其中的效验流程概况如下:

 

1.用户在客户端浏览器第一次登陆系统时,Web服务器首先会效验用户名和密码的正确性,在效验成功后,Web服务器就会为当前用户创建一个Session对象,并将用户信息保存在Session中。

 2.当Session在服务器创建成功后,Web服务器会将生成的sessionID返回给客户端浏览器,客户端浏览器会将sessionID保存在COOKIE中。

 3.当客户端浏览器再次访问服务器时,就会向服务器发送sessionID。服务器在接收处理请求时就会判断这个sessionID对应的Session信息,是否进行登录过并有相应的身份信息。然后根据对应的身份信息,进行对该用户的权限判断,看是否能访问相应的资源。

 


1.3.传统授权的局限

当网站业务规模和访问量的逐步发展扩张后,传统的单机服务器架构模式不在满足应用需求,这个时候服务器架构就会从单台演变为多台服务器的架构模式(集群、分布式等)。

 那么在这种多台服务器的架构模式中,对于传统的session的身份验证方式就会产生“局限”。因为基于Seesion默认的规则上,session是不能跨服务器共享数据的。

 这就是意味着,用户在第一次访问应用时,分配到A服务器登陆验证成功后,第二次访问应用时分配到B服务器时,对于B服务器而言,用户就是一个未登陆未验证的用户。

 

当然,如何去解决session跨服务器共享数据的方案也存在,但这种“补救式”的措施并非一套标准规范的授权认证体系。而本文将有讲解的重点JWT,它就是一套标准化授权认证体系,并且可以解决session身份验证方式存在的短板问题。




2.介绍JWT


2.1.什么是JWT

JWT(JSON Web Token),但从字义上来解释的话,它其实就是用于在Web应用中的一种JSON格式令牌。它一般传递在“身份提供者”和“服务提供者”之间,“身份提供者”需要通过JWT作为一种声明自身安全信息的令牌,从而得到“服务提供者”的信任,以便于从服务器获取相应的资源。

 JWT不光体现在令牌信息本身,它更是一种标准化的数据传输规范,以及作为一个开放的标准(RFC 7519),定义了一种简洁的、自包含的方法只要是在系统之间传输简短,但却需要一定安全等级的数据时,都可以使用JWT规范来传输。

 所以JWT作为了时下流行的授权与认证方案,它并不局限于某个开发平台,在其他语言框架中都有基于JWT规范的实现方案。另外在应用层面,JWT还被广泛的适用于分布式站点的单点登陆中。

 


2.2.JWT具有的好处

1.通用:基于JSON格式的通用性,所以JWT是可以进行跨语言的,像Java、Javascript、PHP、Python等很多语言都可以使用。

2.紧凑:JWT的构成非常简单,占用的字节很小,可以将其方在HTTP请求报文头Header、URL、COOKIE中进行传输。

3.扩展:JWT包含了常用的身份验证结构信息,并且支持自定义结构,另外不在依赖服务端创建Seesion存储信息,非常易于应用的扩展。

 


 2.3.JWT在Web中的请求流程

对上图的流程补充描述如下:

1.客户端在登陆时向授权服务系统发起请求,以便申请“令牌”;

2.授权服务根据用户身份,生成一张专属“令牌”,该“令牌”以JWT格式规范返回给客户端;

3.客户端将获取到的“令牌”放到HTTP报文的Headers中后,向接口服务发起请求。

4.接口服务收到请求后,会从HTTP报文的Headers中获取“令牌”,并从“令牌”中解析出该用户的身份权限信息,然后判断做出相应的处理,从而决定是否允许访问对应的数据资源




3.JWT信息结构

JWT主要由三部分组成:头信息(Header)、消息体(Payload)、签名(Signature)。


3.1.头信息(Header)

头信息(Header)主要由两个部分组成:alg、typ。alg表示JWT的签名算法,一般有两个选择,默认使用的是HS256,另外一种是RS256。typ代表的是Token的类型。对应的JSON表现形式如下:

{
"alg":"HS256",
"typ":"JWT"
}

3.2.消息体(Payload)

消息体(Payload)又叫做“载荷”,可以根据JWT的预定义结构或自定义的结构存放信息,一般包括用户信息或产品信息等。另外Payload中的存放的信息,在ASP.NET Core的验证模型“Claims Based Authentication”又有一种概念叫做“Claim(声明)”。

 

什么是Claim

Claim是对被验证主体特征的一项描述,就拿登陆中的被验证主体用户而言,那么对应的Claim包括:

“用户名是zhangsan”,“email是45544@qq.com”,“手机号码是15654541212”。在Claim当中还包括ClaimType,ClaimType代表描述信息的类型,以上的例子而言,其中ClaimType包括:用户名、email、手机号码。

 将上面Claim和ClaimType概念对应到现实中的事物来看,比如“驾照”,驾照对于交警就是一个被验证的主体,驾照中的“驾驶员姓名:章某某”、“身份证号码:4545454545”等一些描述信息就相当于是一个Claim。

 对于一个被验证主体(用户)而言,肯定不会仅仅存在单个Claim,而会存在多个Claim。那么对于多个Claim构成的数据结构就是“ClaimsIdentity”,可以把“ClaimsIdentity”理解为是被验证主体的“证件”。另外,“ClaimsIdentity”的持有者也就是被验证主体被称为“ClaimsPrincipal”。

 

通常一个简单的载荷JSON如下:

{
"iss":"WebApi",
"aud":"JD-ERP",
"exp":"1650445011"
}

3.3.签名(Signature)

签名实际上是一个加密的过程,基于特定内容和指定算法生成的一段标识,作为验证接收方传递信息是否被篡改的依据。JWT签名作为JWT结构的一部分,其中的内容是包括:Header、PayLoad、密钥,然后通过签名算法将三者生成特定字符串。

 

在JWT签名算法中,一般有两个选择,一种是默认的HS256,另一种就是RS256。

RS256是一种“非对称加密算法”,它拥有一组密钥(公钥和私钥),私钥用于加密(签名),公钥用于解密(验证签名)。而HS256则是一种“对称加密算法”,加密(签名)和解密(验证签名)都使用同一种密钥。基于这两种算法的理解,在实际的应用当中使用RS256签名方式会更加安全。


3.4.内容表现形式

JWT会基于一种对象结构生成特定格式的字符串,字符串中根据JWT的结构也对应了有三个部分,分别由“.”号分割。我们可以通过JWT官方的站点(https://jwt.io/)来查看JWT全部表现形式,以及可以对其进行分析。

 

 

 上图左侧区域的数据,其中红色部分是“消息头”,紫色部分是“载荷”,它们都是基于JSON格式的数据上进行了base64的编码,才变成了一种特定的字符。蓝色部分就是“签名”,它是由:消息头、载荷、密钥,三个JSON格式数据进行签名生成的一种特定字符。

上图右侧区域的数据,是将JWT的Token字符串放在左侧区域解析出来的,通过解析出来的JSON数据就可以方便做一些调试分析。另外,在底部的“签名”区域,就可以清晰的看出我们签名字符串是通过什么样的方式生成的。其中的密钥部分是需要我们手动输入的,输入后就可以验证左侧的Token是否有效。




 4.结尾

本文主要介绍了关于JWT的理论部分,其中主要包括:作用、应用场景、概念、以及对应的结构等。其中弄懂这些概念也不是一蹴而就的,需要结合实际的操作进行演练才能更有深刻的体会。那么在下一个章节,我会主要介绍如何通过代码一步步在ASP.NET Core中实现JWT的授权与认证。

知识改变命运



推荐阅读
  • Vue 2 中解决页面刷新和按钮跳转导致导航栏样式失效的问题
    本文介绍了如何通过配置路由的 meta 字段,确保 Vue 2 项目中的导航栏在页面刷新或内部按钮跳转时,始终保持正确的 active 样式。具体实现方法包括设置路由的 meta 属性,并在 HTML 模板中动态绑定类名。 ... [详细]
  • 本文探讨了如何通过最小生成树(MST)来计算严格次小生成树。在处理过程中,需特别注意所有边权重相等的情况,以避免错误。我们首先构建最小生成树,然后枚举每条非树边,检查其是否能形成更优的次小生成树。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 如何在WPS Office for Mac中调整Word文档的文字排列方向
    本文将详细介绍如何使用最新版WPS Office for Mac调整Word文档中的文字排列方向。通过这些步骤,用户可以轻松更改文本的水平或垂直排列方式,以满足不同的排版需求。 ... [详细]
  • 理解存储器的层次结构有助于程序员优化程序性能,通过合理安排数据在不同层级的存储位置,提升CPU的数据访问速度。本文详细探讨了静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)的工作原理及其应用场景,并介绍了存储器模块中的数据存取过程及局部性原理。 ... [详细]
  • 几何画板展示电场线与等势面的交互关系
    几何画板是一款功能强大的物理教学软件,具备丰富的绘图和度量工具。它不仅能够模拟物理实验过程,还能通过定量分析揭示物理现象背后的规律,尤其适用于难以在实际实验中展示的内容。本文将介绍如何使用几何画板演示电场线与等势面之间的关系。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • MySQL中枚举类型的所有可能值获取方法
    本文介绍了一种在MySQL数据库中查询枚举(ENUM)类型字段所有可能取值的方法,帮助开发者更好地理解和利用这一数据类型。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
author-avatar
手机用户2602890535
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有