IdentityServer4之Authorization Code(授权码)相对更安全

前言

接着授权模式聊,这次说说Authorization Code(授权码)模式,熟悉的微博接入、微信接入、QQ接入都是这种方式(这里说的是oauth2.0的授权码模式),从用户体验上来看,交互方式和Implicit没啥改变,随便找个网站瞅瞅,如慕课网(很不错的学习网站)的登录流程,见下图:

但其实在代码流程上是不太一样的,接下来边撸(我说的是敲代码)边聊。

正文

Authorization Code(授权码)模式比Implicit多了一个授权码的流程,即用户认证成功之后,授权服务器不会马上返回AccessToken,而是先返回一个code(这里称为授权码),然后客户端通过code再去获取Token,主要流程大概如下图:

流程说明:

  1. 用户通过浏览器(User-Agent)访问第三方客户端(Client);

  2. 如果客户端需要进行认证授权,则将其重定向到认证服务器(Authorization server);

  3. 用户(ResorceOwner)在认证服务器上进行认证;

  4. 认证服务器(Authorization server)验证成功之后,返回code(授权码)

  5. 客户端带上code(授权码)再去授权服务器请求获取AccessToken/IdToken;

  6. 授权服务器验证code(授权码)的有效性,验证成功后返回Token;

  7. 后续用户再操作客户端的时候,若需访问保护资源,直接在请求中带上AccessToken即可;

  8. 最终资源服务器(Resource server)返回对应信息;

术语解释:

  • code(授权码):授权服务器认证成功之后返回的code,这个code有时效性,而且只能使用一次

通过上面的流程,Authorization Code(授权码)模式其实更适合有后台的客户端,比如MVC程序,接收code和通过code获取Token的过程都在客户端后台进行,用户无感知;再加上code(授权码)的时效和次数限制,相对来说,这种模式是比较安全的。IdentityServer4已经封装好,所以撸码很简单,继续搞起来↓↓↓

1. 授权服务器和资源服务器代码先从上一节中拷贝过来;

  • 对于资源服务器,还是不需要改动;

  • 对于授权服务器,加个客户端完事;

2. 创建一个MVC客户端,引入相关包并配置OpenID Connect;

2.1 创建一个MVC项目,并引入对应的包,项目结构如下:

2.2 在Startup.cs文件中配置增加认证授权相关配置:

ConfigureServices方法中添加如下代码:

注,在访问API的时候,还需要加入:options.Scope.Add("orderApi");  这个scope在授权服务器已经定义过的,之前的案例也有说到。

Configure方法中添加如下代码:

2.3 将客户端中Controller都增加[Authorize],表示将其保护起来,如果没有通过认证授权,就不能访问;

这样HomeController中的所有Action都保护起来了,如果需要访问,就需要先到授权服务器上进行认证授权。

3. 先跑起来看看效果,如果不出意外,应该没问题;

哦豁!翻车了

当在授权服务器认证授权完成之后,理当正常跳转到客户端(这里用到的是谷歌浏览器,版本为8x),但是偏偏某有,报了一个很莫名其妙的错,如下:

但通过吸取上一节Implicit的经验,初步认为是Cookies没在谷歌浏览器中写入成功,于是就换了360浏览器试了试,没毛病,一切如行云流水一般,正常跳转,原来是如下Cookie没有成功写入,所以找不到,在控制台的时候也有警告提示,没有找到Cookies;

MVC客户端控制台的提示:

解决措施

这是由于新版浏览器对Cookie策略的整改,而谷歌优先进行推广,所以测试总是在谷歌浏览器出问题;和上一节授权处理器的方式一样,如下:

客户端中新增一个处理类:SameSiteCookiesServiceCollectionExtensions.cs,代码内容就不贴啦(git仓库里有),这是公开代码,大佬写好的解决方案;

写好处理类之后,直接使用即可,如下:

完成以上步骤,问题就解决啦;再去测试一把,果然没有问题;

注:如果MVC客户端为Https的话就不会出现以上问题;这和SameSite的三种模式有关:Strict,Lax,None.这里留个小伙伴自己去扩充吧。

4. 在客户端中获取Claims信息及调用受保护的API资源;

先在导航菜单中增加获取Claims和调用API的按钮,因为用到的是MVC布局页,直接在_Layout.cshtml中复制粘贴就完事,如下:

4.1 获取Claims信息,代码如下:

根据导航菜单的配置,在HomeController中增加一个UserInfo的Action,并根据Action新增对应的视图文件UserInfo.csthml:

运行(启动授权服务->启动客户端),点击导航菜单UserInfo,如下:

i

4.2调用API(受保护资源)

在HomeController中增加一个CallAPI的Action,并根据Action新增对应的视图文件CallAPI.csthml,代码如下:

运行(启动授权服务->启动API资源服务->启动客户端),点击CallAPI菜单,如下:

到这Authorization Code(授权码)模式的简单使用就差不多啦,后续的内部业务鉴权在后续的实战项目中会说到;细节流程没截图,就是留给小伙伴一步一步调试吧(代码调试加谷歌浏览器请求)。

源码地址:https://github.com/zyq025/IDS4Demo/tree/main/AuthorizationCode。

总结

在编写测试Demo的时候,会出现很多细节的问题,所以建议小伙伴多敲敲代码,不要复制的那种;另外还需要注意新版本浏览器对Cookies的限制,可能导致一些莫名其妙的错误,上文中已经处理;关于Cookies的规则,大家可以找找资料瞅瞅。

目前所有的案例都是基于内存存储数据,在实际项目中肯定是需要将信息持久化的,所以下一篇说说IdentityServer4的持久化。

一个被程序搞丑的帅小伙,关注"Code综艺圈",跟我一起学~

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

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

相关文章

后端根据百度地图真实路径距离_导航软件哪家强?实测百度地图and高德地图哪个更靠谱...

随着社会的不断发展,人们的生活越来越离不开地图导航,无论是开车出行还是到去到陌生的地方,我们都会用到手机地图。然而在众多导航软件中,使用最为广泛的就要属百度地图和高德地图了。但别看都是导航软件,其中差别还真…

一文读懂 KMP 算法

字符串匹配是计算机的基本任务之一。举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 许多算法可以完成这个任务,Knuth-Morris-Pratt算法&#xff…

128位加密SSL证书

SGC超真SSL(SGC ZhenSSL)属于 SGC Enabled High Assurance SSL, 是 WoSign 的增强型 SSL证书产品,支持 SGC 强制128位加密技术,即使用户的浏览器只支持 40 位( 如 IE4.X) 或 56 位 ( 如 IE5.X) 也能自动强制实现至少 128 位的高强度加密&…

eclipse连接mysql_专题一、flask构建mysql数据库正确姿势

每周壹总结,一起共同充电第121篇应用程序最核心的就是数据,每天我们写程序其实也是在处理数据的过程,那么很有必要系统性的讲讲和梳理python的flask框架是如何进行数据交互操作的。趁这3天假期,分4篇内容来系统的讲讲,…

C#多线程和异步(二)——Task和async/await详解

一、什么是异步同步和异步主要用于修饰方法。当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法;当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务,调用者…

从头到尾彻底理解傅里叶变换算法(上)

从头到尾彻底理解傅里叶变换算法(上) 前言 第一部分、 DFT 第一章、傅立叶变换的由来 第二章、实数形式离散傅立叶变换(Real DFT) 从头到尾彻底理解傅里叶变换算法、下 第三章、复数 第四章、复数形式离散傅立叶变换 前言&#x…

使用ADO.NET的参数集合来有效防止SQL注入漏洞

SQL注入漏洞是个老话题了,在以前做ASP做开发时,就经常需要用字符串的过虑等方式来解决这个问题,但有时候确做的不够彻底,往往让***钻了空子。那么目前在我们.NET中,不管是用WINFORM开发还是用WEBFORM,连接数…

[Abp 源码分析]ASP.NET Core 集成

点击上方蓝字关注我们0. 简介整个 Abp 框架最为核心的除了 Abp 库之外,其次就是 Abp.AspNetCore 库了。虽然 Abp 本身是可以用于控制台程序的,不过那样的话 Abp 就基本没什么用,还是需要集合 ASP.NET Core 才能发挥它真正的作用。在 Abp.AspN…

从头到尾彻底理解傅里叶变换算法(下)

从头到尾彻底理解傅里叶变换算法(上),请看今天第一条。 以下继续: 第三章、复数 复数扩展了我们一般所能理解的数的概念,复数包含了实数和虚数两部分,利用复数的形式可以把由两个变量表示的表达式变成由一个…

树莓派安装python3.5_梦见树_周公解梦梦到树是什么意思_做梦梦见树好不好_周公解梦官网...

梦见树是什么意思?做梦梦见树好不好?梦见树有现实的影响和反应,也有梦者的主观想象,请看下面由(周公解梦官网www.zgjm.org)小编帮你整理的梦见树的详细解说吧。树主健康,树笔直挺拔,象征着人的健康。 在梦中…

[Abp 源码分析]后台作业与后台工作者

点击上方蓝字关注我们0. 简介在某些时候我们可能会需要执行后台任务,或者是执行一些周期性的任务。比如说可能每隔 1 个小时要清除某个临时文件夹内的数据,可能用户会要针对某一个用户群来群发一组短信。前面这些就是典型的应用场景,在 Abp 框…

【转】x.509证书在WCF中的应用(CS篇)

【转自】x.509证书在WCF中的应用(CS篇) 为什么要用x.509证书? WCF的服务端和客户端之间&#xff0c;如 果不作任何安全处理(即服务端的<security mode"None">)&#xff0c;则所有传输的消息将以明文方式满天飞&#xff0c;在internet/intranet环境下无疑是很不…

从概念到案例:初学者须知的十大机器学习算法

本文先为初学者介绍了必知的十大机器学习&#xff08;ML&#xff09;算法&#xff0c;并且我们通过一些图解和实例生动地解释这些基本机器学习的概念。我们希望本文能为理解机器学习基本算法提供简单易读的入门概念。 机器学习模型 在《哈佛商业评论》发表「数据科学家是 21 世…

测试Live Write的插件

1、文字竖排&#xff1a; 删除&#xff0c;只因首页显示时太占空间。2、酷表情&#xff1a;3、Rhapsody SongI am listening to Sad Songs And Waltzes by Cake . Rhapsody.

手把手教你用7行代码实现微信聊天机器人 -- Python wxpy

环境要求&#xff1a; Windows / Linux / Mac OS Python 3.4-3.6&#xff0c;以及 2.7 版本 wxpy安装 ## 使用国内源安装速度快 pip install -U wxpy -i "https://pypi.doubanio.com/simple/" 实例 让机器人与所有好友聊天 from wxpy import * # 实例化&#xff0c;并…

Dapr 已在塔架就位 将发射新一代微服务

微服务是云原生架构的核心&#xff0c;通常使用Kubernetes 来按需管理服务扩展。微软一直走在 Cloud Native Computing Foundation的 最前沿&#xff0c;并通过使用Kubernetes来支持其超大规模Azure和其混合云Azure Stack&#xff0c;微软对云原生的投资一部分来自其工具&#…

python 复制文件_10 行 Python 代码写 1 个 USB 病毒

(给Python开发者加星标&#xff0c;提升Python技能)转自&#xff1a; 知乎-DeepWeaver昨天在上厕所的时候突发奇想&#xff0c;当你把usb插进去的时候&#xff0c;能不能自动执行usb上的程序。查了一下&#xff0c;发现只有windows上可以&#xff0c;具体的大家也可以搜索(搜索…

html5中外描边怎么写,CSS3实现文字描边的2种方法(小结)

问题最近遇到一个需求&#xff0c;需要实现文字的描边效果&#xff0c;如下图解决方法一首先想到去看CSS3有没有什么属性可以实现&#xff0c;后来被我找到了text-stroke该属性是一个复合属性&#xff0c;可以设置文字宽度和文字描边颜色该属性使用很简单&#xff1a;text-stro…

混凝土墙开洞_满城混凝土柱子切割资质齐全

满城混凝土柱子切割资质齐全专业楼板切割开洞&#xff0c;钢筋混凝土墙开门&#xff0c;开窗&#xff0c;开方洞。混泥土承重墙新开门洞、开窗、通风管道开洞、专业开楼梯口&#xff0c;楼梯口加固&#xff0c;地下室开门洞&#xff0c;水泥墙开门加固、楼板加固、砖墙开门开窗…

马云害怕的事还是发生了

当前&#xff0c;余额宝的收益维持在4%左右不能突破&#xff0c;只能用作“钱包”放点零钱了。 放银行或者余额宝收益偏低&#xff0c;股票市场又处于震荡周期&#xff0c;期货市场等不是普通人进得去的&#xff0c;还不如直接买较高收益的互联网理财产品。 比如屡受政策利好…