IdentityServer4 之 Resource Owner Password Credentials 其实有点尴尬

前言

接着IdentityServer4的授权模式继续聊,这篇来说说 Resource Owner Password Credentials授权模式,这种模式在实际应用场景中使用的并不多,只怪其太开放啦,直接在客户端上拿着用户名和密码就去授权服务器获取AccessToken,这样容易被客户端拿着用户名和密码搞坏事;接下来就详细说说。

正文

Resource Owner Password Credentials授权模式与上一节说到的客户端凭据模式不同,这是有用户参与的,用户就是资源拥有者;通过允许在客户端使用用户名和密码的方式向授权服务器获取AccessToken,AccessToken和用户相关,即不同的用户获取到的AccessToken不一样。

术语解释:
  • Resource Owner:资源所有者,即拥有资源的用户;绝大对数小伙伴都应该有自己的QQ,如果没特殊情况,相信每一个小伙伴的QQ空间中都有自己曾经觉得很酷或很有纪念意义的照片,这里的照片就是资源,而小伙伴就是资源所有者。QQ服务器就是资源服务器。

Resource Owner Password Credentials 流程

流程简要说明:

  1. 首先用户和客户端需要提前在授权服务器上备案过的,用户没有备案,在资源服务器肯定就没有对应的资源,客户端没有备案就不能随意去授权服务器获取AccessToken;

  2. 用户在客户端上输入用户名和密码,并带上备案过的客户端凭据一起请求授权服务器获取AccessToken;

  3. 授权服务器验证用户凭据和客户端凭据,成功之后直接返回代表该用户的AccessToken;

  4. 用户在操作时,带上AccessToken访问资源服务器;

  5. 资源服务器正常返回结果,如果没有AccessToken是不能访问受保护资源的;

结合流程,看看代码如何实现,步伐跟上哦;

这里资源服务器和授权服务器就拷贝之前客户端模式的代码(这样每种模式的代码区分开,方便查看),在原有基础上修改代码即可;

代码地址:https://github.com/zyq025/IDS4Demo

>>在原有的授权服务器上增加代码
  1. 模拟在授权服务器中备案用户,方便测试效果,就在内存中模拟;

  2. 备案新的客户端,指定其授权方式;


  3. 好啦,到这授权服务器的修改就完成啦,用postman先测试一下;

>>授权服务器修改完啦,资源服务器不用动,那就到客户端啦
  1. 新建一个Winform窗体程序,简单布局安排上;并引入IdentityModel包;

  2. 编写获取AccessToken逻辑,在GetAccessToken按钮点击事件中增加代码,如下:

  3. 先启动授权服务器,看看access_token运行效果,如下:

  4. 获取到AccessToken之后就可以访问受保护的API啦,在调用API按钮点击事件中进行逻辑编写,如下:

  5. 授权服务器、资源服务器、客户端启动运行看效果,如下:

以上就是Resource Owner Password Credentials的使用,流程是不是很简单。接下来聊聊这种模式的其他话题;

Resource Owner Password Credentials的尴尬之处

在oauth2.0中如果使用这种模式,规定是不允许客户端存储资源所有者的用户名和密码的,但如果是第三方客户端想搞事情,就把用户信息先存一把,这样就导致间接泄露用户信息的风险很高(如果第三方客户端被攻击了),这也是这种模式在实际应用场景使用比较少的原因,如果有其他模式选择,不建议使用此模式;

通常以下情况,可以考虑使用:

  • 客户端是可高度信任的,且安全性要有保障;

  • 遗留应用,没有其他好的解决方案,可以使用;

有用户参与获取的accessToken和客户端凭据获取到的有什么区别

之前客户端凭据模式的截图:

资源所有者密码模式的截图:

小伙伴肯定看出来不止多一个,但其中比较重要的就是sub这个claim,如果sub存在,调用API的access_token就能区分是代表用户的,否则就是代表客户端的。即有用户参与获取的acess_token是代表用户的,每个用户的token都不一样。

refresh_token得补上

refresh_token是为了给access_token进行延长有效期而存在的,为了安全和降低风险,access_token的有效期一般设置的比较短,通常会是两个小时(根据需要设置),当access_token失效时,常规的做法就是让其跳转到登录页重新登录获取,这样频繁的跳转到登录页,用户体验及其不好,为避免这种情况,需对access_token进行在线续命,即延长有效期;实现的方案各种各样,比如有在前端定时检测的,也有在后端做有效判断的,但用的相对比较多还是使用refresh_token的形式,当access_token失效时,会采用refresh_token去请求新的access_token,保证用户正常操作。

如果需要在获取access_token的时候同时返回refresh_token,需要在授权服务器上备案客户端时将AllowOfflineAccess设置为true,如下所示:

refresh_token具体使用,在后续的案例单独说吧。

总结

关于Resource Owner Password Credentials 就简单说这么多,主要是看看如何使用,相信小伙伴在新的项目中应该会很少用到,毕竟拿着用户名和密码直接在第三方客户端搞事情,始终还是有风险;下一篇说说Implicit(简化模式)

源码地址:https://github.com/zyq025/IDS4Demo

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

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

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

相关文章

存储过程mysql报错1271_mysqldump备份失败以及解决方法汇总

mysqldump备份失败以及解决方法汇总〇 mysqldump: Error: Query execution was interrupted, maximum statement execution time exceeded when trying to dump tablespaces〇 mysqldump: Error 3024: Query execution was interrupted, maximum statement execution time exce…

Xamarin使XRPC实现接口/委托远程调用

在之前的文章中已经介绍如何使用Beetlex.XRCP组件进行接口/委托远程调用;由于组件BeetleX.XRPC.Clients支持.NETStandard2,因此Xamarin同样可以使用它来实现基于接口/委托的数据交互通讯。接下来通过Xamarin实现一个简单的移动程序,并通过XRP…

mysql 拷贝安装_Mysql的安装和主从复制

安装mysql服务步骤一:首先下载mysql的yum源配置 ,下载mysql的yum源wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm步骤二:安装mysql的yum源yum -y install mysql57-community-release-el7-11.noarch.rpm步骤三&…

浅谈CLR基础知识

中午的时候,有一个小伙伴问我,CLR到底是进程还是线程,它和自己写的程序是怎么关联的。这一问,直接把我问懞了。下面我尝试用简单的语言来描述这个问题,有的地方无法讲的太细(不然内容会太多)&am…

mysql打开无法控制_MySQL不能启动和停止 MySQL各种解决方法教程

MySQL不能启动和停止 MySQL各种解决方法教程本文章总结了种MySQL无法启动、无法停止解决办法,包括在windows系统,linux系统中mysql不能启动与停止的解决办法,有需了解的朋友可进入参考。解决无法启动A、先使用命令C:/Program files/mysql/bin/mysqladmin…

NHibernate中的SchemaExport

昨天,在看hibernate文档的时候,看到了这样一段: You should now create this table in your database manually, and later read Chapter 15, Toolset Guide if youwant to automate this step with the SchemaExport tool. This tool can …

Asp.Net Core使用Skywalking实现分布式链路追踪

介绍Skywalking 是 Apache 基金会下面的一个开源 APM 项目,是一套(APM)分布式追踪系统,提供了很多数据存储列如:Mysql,H2,Elasticsearch7 等。其中APM 全称是应用性能监测软件,主要是用来处理以及追踪分布式…

python 里什么时候缩进_python什么时候缩进

Python中的缩进(Indentation)决定了代码的作用域范围。这一点和传统的c/c有很大的不同(传统的c/c使用花括号花括号{}符决定作用域的范围;python使用缩进空格来表示作用域的范围,相同缩进行的代码是处于同一范围)。每行代码中开头的空格数(whitespace)用于…

Hey, everybody!

今天有一位MVP朋友问我是否想做MVP,我想了半天,还是觉得有机会就要尝试,失败了也没什么大不了的。所以最后决定要参加这么一次活动,虽然是自不量力,也要搏一搏啦!如果说大家都能够来推荐我一下多好啊&#…

C# 9 新特性 —— 补充篇

C# 9 新特性 —— 补充篇Intro前面我们分别介绍了一些 C# 9 中的新特性,还有一些我觉得需要了解一下的新特性,写一篇作为补充。Top-Level Statements在以往的代码里,一个应用程序必须要有 Main 方法才能运行,从 C# 9 开始&#xf…

使用Popup窗口创建无限级Web页菜单(5)

代码框架在(4)里面已经全部列出来了,现在工作就是按流程把他们完成。本来实现一个prototype的Menu菜单类只需要最多300行代码,可是后来做了一些操作习惯支持和UI显示上的优化后,代码猛增到了1000多行。不过final版本看起来确实比土不拉叽的pr…

【gRPC】ProtoBuf 语言快速学习指南

继上篇【gRPC】 在.Net core中使用gRPC了解了gRPC的使用,gRPC基于HTTP/2和ProtoBuf,ProtoBuf就非常有必要好好了解一下了,那么ProtoBuf究竟是什么?ProtoBuf Google Protocol Buffer是一种语言无关、平台无关、可扩展的序列化结构数…

vspythonqt混合_PYQT5 vscode联合操作qtdesigner的方法

除了使用pycharm外,还可使用vscode来操作pyqt,方法如下:1. 在vscode中配置相关的pyqt的相关根据自己实际情况修改第一项pyqt的路径2. 创建一个文件夹,右键,最后一项可以创建一个新窗口创建的新窗口后缀为 .ui右键中有以…

发现 ASP.Net 的一个关于回车提交的 Bug ? 必须多于一个 Text 域回车提交,Server: ButtonX_Click 才能截获!...

ASP.Net 中: 如果 Text 类型的域只有一个,此时按下回车提交,WebServer 端 ButtonX_Click 竟然截获不到,只能在 WebServer 端 Page_Load 里截获,与传统的 Web Form 提交到 Action CGI 没区别了!假如 Text 类型的域多于一个,此时按下回车提交,在 WebServer 端 ButtonX_Click 可以…

TIOBE 1 月榜单:Python年度语言四连冠,C 语言再次第一

喜欢就关注我们吧!TIOBE 公布了 2021 年 1 月的编程语言排行榜。TIOBE 本月公布了 2020 年度编程语言,Python 获得四连冠,是过去一年中最受欢迎的编程语言。Python 在 2020 年实现了 2.01% 的正增长;C 紧随其后&#x…

java 验证登陆_java登陆界面验证

展开全部以下代码就是了。详细参照附件import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swin…

A piecture of J2EE Core Patterns

这张图是J2EE Core Patterns里面的一幅图片,在Enterprise Solution Patterns Using Microsoft.Net里面虽然模式的概念与应用大同小异,但是那张表现架构模式整体的图感觉有点不直观,相比之下这幅图显得更清晰一点。 发到这里供大家参考学习:&#xff09…

孙丕恕离开浪潮 仪器厂历时60年成为服务器龙头企业

2020年12月31日浪潮集团有限公司董事会选举邹庆忠为公司董事长(法定代表人);孙丕恕不再担任公司董事长;公司不再聘任孙丕恕为首席执行官。另外,经省委研究决定,拟任省直部门(单位)副…

java 数组 树_java使用顺序数组实现二叉树

顺序数组实现二叉树实现原理对于下标为index的节点其满足1.左孩子节点的下标为2index12.右孩子节点的下标为2index2代码实现package tree;public class ArrayBinaryTree {private int[] arr;public ArrayBinaryTree(int[] arr){this.arrarr;}public void preOrder(int index){i…

hack 入侵 142 主机的过程

时间 2005 3 29 iis 日志文件显示有黑客痕迹 常用的iis 分析软件的介绍 使用 find 命令 入侵检测的常用方法参考 http://www.xfocus.net/articles/200208/440.html 编写日志脚本参考 http://www.blueidea.com/bbs/archivecontent.asp?id1304500 sql 注入方法介绍和预防 http:/…