【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程...

上篇文章介绍了基于Ids4密码授权模式,从使用场景、原理分析、自定义帐户体系集成完整的介绍了密码授权模式的内容,并最后给出了三个思考问题,本篇就针对第一个思考问题详细的讲解下Ids4是如何生成access_token的,如何验证access_token的有效性,最后我们使用.net webapi来实现一个外部接口(本来想用JAVA来实现的,奈何没学好,就当抛砖引玉吧,有会JAVA的朋友根据我写的案例使用JAVA来实现一个案例)。

.netcore项目实战交流群(637326624),有兴趣的朋友可以在群里交流讨论。

一、JWT简介

  1. 什么是JWT?
    JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

  2. 什么时候使用JWT?

1)、认证,这是比较常见的使用场景,只要用户登录过一次系统,之后的请求都会包含签名出来的token,通过token也可以用来实现单点登录。

2)、交换信息,通过使用密钥对来安全的传送信息,可以知道发送者是谁、放置消息是否被篡改。

  1. JWT的结构是什么样的?

JSON Web Token由三部分组成,它们之间用圆点(.)连接。这三部分分别是:

  • Header

  • Payload

  • Signature

Header
header典型的由两部分组成:token的类型(“JWT”)和算法名称(比如:HMAC SHA256或者RSA等等)。

例如:

640?wx_fmt=png

然后,用Base64对这个JSON编码就得到JWT的第一部分

Payload

JWT的第二部分是payload,它包含声明(要求)。声明是关于实体(通常是用户)和其他数据的声明。声明有三种类型: registered, public 和 private。

  • Registered claims : 这里有一组预定义的声明,它们不是强制的,但是推荐。比如:iss (issuer), exp (expiration time), sub (subject), aud (audience)等。

  • Public claims : 可以随意定义。

  • Private claims : 用于在同意使用它们的各方之间共享信息,并且不是注册的或公开的声明。

下面是一个例子:

640?wx_fmt=png

对payload进行Base64编码就得到JWT的第二部分

注意,不要在JWT的payload或header中放置敏感信息,除非它们是加密的。

Signature

为了得到签名部分,你必须有编码过的header、编码过的payload、一个秘钥,签名算法是header中指定的那个,然对它们签名即可。

例如:HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

签名是用于验证消息在传递过程中有没有被更改,并且,对于使用私钥签名的token,它还可以验证JWT的发送方是否为它所称的发送方。

二、IdentityServer4是如何生成jwt的?

在了解了JWT的基本概念介绍后,我们要知道JWT是如何生成的,加密的方式是什么,我们如何使用自己的密钥进行加密。

IdentityServer4的加密方式?

Ids4目前使用的是RS256非对称方式,使用私钥进行签名,然后客户端通过公钥进行验签。可能有的人会问,我们在生成Ids4时,也没有配置证书,为什么也可以运行起来呢?这里就要讲解证书的使用,以及Ids4使用证书的加密流程。

1、加载证书

Ids4默认使用临时证书来进行token的生成,使用代码 .AddDeveloperSigningCredential(),这里会自动给生成tempkey.rsa证书文件,所以项目如果使用默认配置的根目录可以查看到此文件,实现代码如下:

640?wx_fmt=png

这也就可以理解为什么没有配置证书也一样可以使用了。

注意:在生产环境我们最好使用自己配置的证书。

如果我们已经有证书了,可以使用如下代码实现,至于证书是如何生成的,网上资料很多,这里就不介绍了。

 .AddSigningCredential(new X509Certificate2(Path.Combine(basePath,"test.pfx"),"123456"));

然后注入证书相关信息,代码如下:

builder.Services.AddSingleton<ISigningCredentialStore>(new DefaultSigningCredentialsStore(credential));builder.Services.AddSingleton<IValidationKeysStore>(new DefaultValidationKeysStore(new[] { credential.Key }));

后面就可以在项目里使用证书的相关操作了,比如加密、验签等。

2、使用证书加密

上篇我介绍了密码授权模式,详细的讲解了流程,当所有信息校验通过,Claim生成完成后,就开始生成token了,核心代码如下。

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

知道了这些原理后,我们就能清楚的知道access_token都放了那些东西,以及我们可以如何来验证生成的Token

三、如何验证access_token的有效性?

知道了如何生成后,最主要的目的还是要直接我们服务端是如何来保护接口安全的,为什么服务端只要加入下代码就能够保护配置的资源呢?

640?wx_fmt=png

在理解这个前,我们需要了解系统做的验证流程,这里使用一张图可以很好的理解流程了。

640?wx_fmt=png
看完后是不是豁然开朗?这里就可以很好的理解/.well-known/openid-configuration/jwks原来就是证书的公钥信息,是通过访问/.well-known/openid-configuration暴露给所有的客户端使用,安全性是用过非对称加密的原理保证,私钥加密的信息,公钥只能验证,所以也不存在密钥泄漏问题。

虽然只是短短的几句代码,就做了那么多事情,这说明Ids4封装的好,减少了我们很多编码工作。这是有人会问,那如果我们的项目不是.netcore的,那如何接入到网关呢?

网上有一个Python例子,用 Identity Server 4 (JWKS 端点和 RS256 算法) 来保护 Python web api.

本来准备使用Java来实现,好久没摸已经忘了怎么写了,留给会java的朋友实现吧,原理都是一样。

下面我就已webapi为例来开发服务端接口,然后使用Ids4来保护接口内容。

新建一个webapi项目,项目名称Czar.AuthPlatform.WebApi,为了让输出的结果为json,我们需要在WebApiConfig增加config.Formatters.Remove(config.Formatters.XmlFormatter);代码,然后修改默认的控制器ValuesController,修改代码如下。

640?wx_fmt=png

为了保护api安全,我们需要增加一个身份验证过滤器,实现代码如下。

640?wx_fmt=png

640?wx_fmt=png

代码非常简洁,就实现了基于Ids4的访问控制,现在我们开始使用PostMan来测试接口地址。

我们直接请求接口地址,返回401未授权。
640?wx_fmt=png

然后我使用Ids4生成的access_token再次测试,可以得到我们预期结果。
640?wx_fmt=png

为了验证是不是任何地方签发的token都可以通过验证,我使用其他项目生成的access_token来测试,发现提示的401未授权,可以达到我们预期结果。
640?wx_fmt=png

现在就可以开心的使用我们熟悉的webapi开发我们的接口了,需要验证的地方增加类似[Ids4Auth("http://localhost:6611", "mpc_gateway")]代码即可。

使用其他语言实现的原理基本一致,就是公钥来验签,只要通过验证证明是允许访问的请求,由于公钥一直不变(除非认证服务器更新了证书),所以我们请求到后可以缓存到本地,这样验签时可以省去每次都获取公钥这步操作。

四、总结

本篇我们介绍了JWT的基本原理和Ids4JWT实现方式,然后使用.NET webapi实现了使用Ids4保护接口,其他语言实现方式一样,这样我们就可以把网关部署后,后端服务使用任何语言开发,然后接入到网关即可。

有了这些知识点,感觉是不是对Ids4的理解更深入了呢?JWT确实方便,但是有些特殊场景是我们希望Token在有效期内通过人工配置的方式立即失效,如果按照现有Ids4验证方式是没有办法做到,那该如何实现呢?我将会在下一篇来介绍如何实现强制token失效,敬请期待吧。

640?wx_fmt=jpeg

相关文章:

  • AspNetCore中使用Ocelot之 IdentityServer4

  • Ocelot-基于.NET Core的开源网关实现

  • .NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权

  • Swagger如何访问Ocelot中带权限验证的API

  • Ocelot.JwtAuthorize:一个基于网关的Jwt验证包

  • .NET Core微服务之基于Ocelot实现API网关服务

  • .NET Core微服务之基于Ocelot实现API网关服务(续)

  • .NET微服务体系结构中为什么使用Ocelot实现API网关

  • Ocelot简易教程(一)之Ocelot是什么

  • Ocelot简易教程(二)之快速开始1

  • Ocelot简易教程(二)之快速开始2

  • Ocelot简易教程(三)之主要特性及路由详解

  • Ocelot简易教程(四)之请求聚合以及服务发现

  • Ocelot简易教程(五)之集成IdentityServer认证以及授权

  • Ocelot简易教程(六)之重写配置文件存储方式并优化响应数据

  • Ocelot简易教程(七)之配置文件数据库存储插件源码解析

  • ASP.NET Core中Ocelot的使用:API网关的应用

  • ASP.NET Core中Ocelot的使用:基于Spring Cloud Netflix Eureka的动态路由

  • ASP.NET Core中Ocelot的使用:基于服务发现的负载均衡

  • 【.NET Core项目实战-统一认证平台】第一章 功能及架构分析

  • 定制Ocelot来满足需求

  • 【.NET Core项目实战-统一认证平台】第三章 网关篇-数据库存储配置(1)

  • 【.NET Core项目实战-统一认证平台】第四章 网关篇-数据库存储配置(2)

  • 【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis

  • 【.NET Core项目实战-统一认证平台】第六章 网关篇-自定义客户端授权

  • 【.NET Core项目实战-统一认证平台】第七章 网关篇-自定义客户端限流

  • 【.NET Core项目实战-统一认证平台】第八章 授权篇-IdentityServer4源码分析

  • 【.NET Core项目实战-统一认证平台】第九章 授权篇-使用Dapper持久化IdentityServer4

  • 【.NET Core项目实战-统一认证平台】第十章 授权篇-客户端授权

  • 【.NET Core项目实战-统一认证平台】第十一章 授权篇-密码授权模式

原文地址: https://www.cnblogs.com/jackcao/p/10195351.html

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


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

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

相关文章

树的应用:括号树

传送门 文章目录解析代码解析 没有做出来。。。 一开始看到了一个&#xff08;自以为&#xff09;很好的性质&#xff0c;再加上之前做一些括号相关题的刻板印象&#xff0c;导致这题没掉了… 我的角度和正解完全背道而驰了 放下乱七八糟的前缀和与st’表&#xff0c;回归朴素…

P5049 [NOIP2018 提高组] 旅行

P5049 [NOIP2018 提高组] 旅行 题意&#xff1a; 一棵树(可能是基环树)&#xff0c;从1出发&#xff0c;每到达一个新的点就记录下编号。求一种走法使得记录下来的编号字典序最小。 1≤n≤500000 mn−1 或 mn 题解&#xff1a; 如果不是基环树&#xff0c;那直接每次走字典…

失配树

名字看起来挺高级的&#xff0c;然而其实就是 \(\text{KMP}\) 上树啦。 我们将每个点的 \(nex[i]\) 与 \(i\) 连边&#xff0c;那么最终 \(border\) 关系会形成一棵树&#xff0c;之后就可以在树上搞事情啦&#xff01; P5829 【模板】失配树 这题比较裸&#xff0c;直接根据定…

P7116-[NOIP2020]微信步数【数学】

正题 题目链接:https://www.luogu.com.cn/problem/P7116 题目大意 有一个kkk维空间&#xff0c;第iii维长度为wiw_iwi​&#xff0c;有nnn步每一步都是让某个维的坐标1/−11/-11/−1&#xff0c;每次走完nnn步都会从111重新走一次&#xff0c;现在求从这个空间的每个点出发走…

[2019CSP-S Day1]提高组Day1题解(格雷码[模拟(k转二进制取反的做法带证明)] + 括号树[DP] + 树上的数(暴力+菊花图+单链))

Day1T1&#xff1a;格雷码题目题解代码实现T2&#xff1a;括号树题目题解代码实现T3&#xff1a;树上的数题目10pts暴力题解代码实现25pts菊花图题解代码实现25pts单链题解代码实现T1&#xff1a;格雷码 题目 通常&#xff0c;人们习惯将所有 n位二进制串按照字典序排列&…

模板:环套树

文章目录前言解析找环代码练习环套树的直径代码thanks for reading&#xff01;前言 环套树者&#xff0c;一个环套一棵树也 解析 定义&#xff1a;n个点&#xff0c;n条边的无向连通图 其实就是树多了一条边&#xff0c;连出了一个环 性质&#xff1a;如果对环套树进行dfs&am…

使用PerfView监测.NET程序性能(四):折叠,过滤和时间范围选择

在上一篇文章使用PerfView监测.NET程序性能&#xff08;三&#xff09;&#xff1a;分组中&#xff0c;我们使用了Perfview的分组功能。分组功能旨在对某些函数按照某个格式进行分组&#xff0c;以减少视图中的各种无关函数的数量。但仅有分组还不够&#xff0c;有时我们想将一…

P1352 没有上司的舞会

P1352 没有上司的舞会 题意&#xff1a; 给你一个树&#xff0c;每个点都有权值&#xff0c;选择一些点使得权值和最大&#xff0c;要求父亲节点和子节点不能同时选择 题解&#xff1a; 经典树形dp dp[x][0]表示以x为根的子树&#xff0c;且x不参加舞会的最大快乐值 dp[x][…

基础字符串

初三巨佬djwj233 基础字符串

CF536C-Tavas and Pashmaks【凸壳】

正题 题目链接:https://codeforces.com/contest/536/problem/C 题目大意 nnn个人&#xff0c;第iii个人的游泳速度sis_isi​&#xff0c;跑步速度是rir_iri​。如果跑道长度是RRR&#xff0c;泳道长度是SSS那么一个人的用时就是RriSsi\frac{R}{r_i}\frac{S}{s_i}ri​R​si​S​…

带旋treap概念及模板,带例题:普通平衡树

带旋Treap二叉查找树BST(Binary Search Tree)定义Treap定义模板合集&#xff08;均为O(logn)O(logn)O(logn)&#xff09;push_up模板旋转模板插入模板删除模板查找前驱模板查找后驱模板查找键值key模板查找节点的修正值rank模板PS&#xff1a;rd的比较问题例题&#xff1a;普通…

微服务系列实践 .NET CORE

从事这个行业转眼已经6年了&#xff0c;从当初刚毕业的在北京朝八晚十&#xff0c;从二环到五环&#xff0c;仍每天精力充沛的小愤青&#xff1b;再到深圳一点一滴的辛勤在软件行业的耕种&#xff0c;从当初单体应用架构到现在微服务架构的经历&#xff0c;回想起来自己的收获倒…

P2607 [ZJOI2008]骑士

P2607 [ZJOI2008]骑士 题意&#xff1a; n个点n个边&#xff0c;每个点都有权值&#xff0c;相邻的点不能同时选择&#xff0c;问如何选择能使得权值最大 题解&#xff1a; 这个题很有P1352 没有上司的舞会这个题的感觉&#xff0c;唯一的区别是那个题保证是树&#xff0c;…

模板:线段树优化建图

前言 百川到海&#xff0c;天下归一 解析 线段树优化建图是用于对一个区间的点连边时的优化方法 建一棵in树一棵出树分别往上和下指即可 大概长这样 &#xff08;pia的洛谷的照片&#xff09; 建树 正常动态开点即可 void build(int &k,int l,int r){tr[ktot](tree){0…

Binary Search

01 分数划分 什么 01 分数划分&#xff0c;叫 Binary Search 多好。 P1642 规划 可以二分答案 \(x\)&#xff0c;考虑选择 \(n-m\) 个数使得答案 \(\ge x\)。 \[\dfrac{\sum w(i)}{\sum c(i)}\ge x \]\[\sum w(i)\ge \sum (x\times c(i)) \]\[\sum(w(i)-x\times c(i))\ge 0 \]之…

CF1556F-Sports Betting【状压dp,数学期望】

正题 题目链接:https://www.luogu.com.cn/problem/CF1556F 题目大意 nnn个点的一张竞赛图&#xff0c;每个点有一个权值aia_iai​&#xff0c;(i,j)(i,j)(i,j)之间的边iii连jjj的概率是aiaiaj\frac{a_i}{a_ia_j}ai​aj​ai​​&#xff0c;否则jjj连iii。 现在期望有多少个点…

[非旋平衡树]fhq_treap概念及模板,例题:普通平衡树,文艺线段树

文章目录概念全套模板push_up模板split拆树模板(按权值拆)split拆树模板(按个数拆)merge合并模板&#xff08;地址版&#xff09;merge合并模板&#xff08;带返回根&#xff09;区间模板insert插入模板delete删除模板find_kth找第k大模板get_rank找排名模板pre找前驱模板suf找…

P4381 [IOI2008]Island

P4381 [IOI2008]Island 题意&#xff1a; 给你一棵基环树森林&#xff0c;求出基环树的直径之和. 题解&#xff1a; 对于基环树,我们将环看作根,那么直径有两种情况:: 1.不经过环,也就是环上某个点的子树内部,对于这种情况,直接在子树内部处理直径,更新答案即可; 2.经过环…

20210912模拟

文章目录总结复盘总结 190pts 50403070 今天吸取了昨天的教训&#xff0c;没有再像之前一样先死磕一道题&#xff0c;把命运押在切题上&#xff0c;整体时间分配还算合理 要认真审题&#xff01; 今天T1少看了条件&#xff0c;T4一开始看错题意浪费了时间… 复盘 先看题 乍…

surging 微服务引擎 1.0 正式发布

surging 是一个分布式微服务引擎,提供高性能RPC远程服务调用&#xff0c;服务引擎支持http、TCP、WS、Mqtt协议,采用Zookeeper、Consul作为surging服务的注册中心&#xff0c;集成了哈希一致性&#xff0c;随机&#xff0c;轮询、压力最小优先作为负载均衡的算法&#xff0c;底…