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高德地图哪个更靠谱...

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

php用ajaxs上传图片_jquery+ajax+php 图片上传

最近在写“网上商城”的课程设计,用到了图片上传。我要实现的功能主要有:(1)能够上传多张图片,不过当然是有限制的,最多5张;(2)能够进行图片预览;(3)能够删除图片;(4)服务器能够获取上传的图片信…

一文读懂 KMP 算法

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

node.js require 自动执行脚本 并生成html,nodejs 执行脚本并实时输出

接到需求需要一个服务来执行shell脚本,要求可以实时打印shell脚本执行的过程,并看到脚本执行的结果。明确任务目标:这是一个web服务,需要执行shell脚本当一个脚本执行的时候,再次发送请求需要等待当前脚本执行完毕&…

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…

php sorcket_PHP: Sockets - Manual

socket_accept — Accepts a connection on a socketsocket_addrinfo_bind — Create and bind to a socket from a given addrinfosocket_addrinfo_connect — Create and connect to a socket from a given addrinfosocket_addrinfo_explain — Get information about addrin…

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

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

HTML阅读位置,script在HTML文档中位置

从大红书中学习到的HTML文档解释方式:按照HTML文档中顺序依次从上到下解释解释过程中遇到就会异步的下载css然后继续向下解释遇到就会异步的下载图片,然后继续向下解释遇到我们该如何缓解同步执行的script脚本阻塞HTML的解释呢?将给用途&…

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

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

python 正则匹配 条件太多怎么办_Python条件正则表达式

我的程序被赋予一个带参数的对象,我需要获取参数的值。 我的程序给出的对象如下所示:Object """{{objectName| parameter1random text| parameter2that may or may not| parameter3contain any letter (well, almost)| parameter4this i…

python分布式爬虫及数据存储_二十一 Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫数据保存...

注意:数据保存的操作都是在pipelines.py文件里操作的将数据保存为json文件spider是一个信号检测# -*- coding: utf-8 -*-# Define your item pipelines here## Dont forget to add your pipeline to the ITEM_PIPELINES setting# See: http://doc.scrapy.org/en/lat…

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

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

ios html 转义字符串,ioS html的转义

标签:iosNSString *htmlString "快乐每一天,还剩365天";NSAttributedString *attributedString [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUTF8StringEncoding] options:{NSDocumentTypeDocumentAttribute…

树莓派安装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环境下无疑是很不…

汉字为什么能流传至今_汉字能流传至今,比毛不易还不易,它的同龄字统统都死掉了...

谁是中国历史上最牛逼的发明&#xff1f;造纸术、指南针&#xff1f;火药、活字印刷术&#xff1f;我觉得都不是我心中最牛逼的发明是来&#xff0c;你坐在椅子上闭上眼睛试着想象一下如果从没有过汉字&#xff0c;会怎么样&#xff1f;如果汉字灭绝了&#xff0c;会怎么样&…