前言

接着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(简化模式)

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

IdentityServer4 之 Resource Owner Password Credentials 其实有点尴尬的更多相关文章

  1. IdentityServer4之Resource Owner Password Credentials(资源拥有者密码凭据许可)

    IdentityServer4之Resource Owner Password Credentials(资源拥有者密码凭据许可) 参考 官方文档:2_resource_owner_passwords ...

  2. asp.net core IdentityServer4 实现 resource owner password credentials(密码凭证)

    前言 OAuth 2.0默认四种授权模式(GrantType) 授权码模式(authorization_code) 简化模式(implicit) 密码模式(resource owner passwor ...

  3. 不要使用Resource Owner Password Credentials

    不要使用Resource Owner Password Credentials 文章链接在这里 前言 最近公司项目在做一些重构,因为公司多个业务系统各自实现了一套登录逻辑,比较混乱.所以,现在需要做一 ...

  4. 使用Resource Owner Password Credentials Grant授权发放Token

    对应的应用场景是:为自家的网站开发手机 App(非第三方 App),只需用户在 App 上登录,无需用户对 App 所能访问的数据进行授权. 客户端获取Token: public string Get ...

  5. 基于 IdentityServer3 实现 OAuth 2.0 授权服务【密码模式(Resource Owner Password Credentials)】

    密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码.客户端使用这些信息,向"服务商提供商"索要授权 ...

  6. 基于OWIN WebAPI 使用OAuth授权服务【客户端验证授权(Resource Owner Password Credentials Grant)】

    适用范围 前面介绍了Client Credentials Grant ,只适合客户端的模式来使用,不涉及用户相关.而Resource Owner Password Credentials Grant模 ...

  7. OAuth2.0学习(1-6)授权方式3-密码模式(Resource Owner Password Credentials Grant)

    授权方式3-密码模式(Resource Owner Password Credentials Grant) 密码模式(Resource Owner Password Credentials Grant ...

  8. IdentityServer4专题之六:Resource Owner Password Credentials

    实现代码: (1)IdentityServer4授权服务器代码: public static class Config {  public static IEnumerable<Identity ...

  9. ABP中使用OAuth2(Resource Owner Password Credentials Grant模式)

    ABP目前的认证方式有两种,一种是基于Cookie的登录认证,一种是基于token的登录认证.使用Cookie的认证方式一般在PC端用得比较多,使用token的认证方式一般在移动端用得比较多.ABP自 ...

随机推荐

  1. john快速破解各种散列hash

    0x01 john工具安装: kali系统自带的有,也可以自己安装在其他linux和windows系统上,关于安装步骤网上都有可自行百度. 0x02 john常用选项 具体的其他选项可通过john - ...

  2. C# operator 关键字的用法

    operator 只要是运算符都能重载 operator 关键字的主要作用是用来重载运算符的,还可以用于类或结构中类型的自定义转换. 下面看个例子 class Feige { //定义两个全局变量 i ...

  3. LZZ磁力资源搜索4.2.2,整合多个站点,大部分资源都能搜到

    资源搜索 4.2.2.20200310网友提出的功能已完成1:新增 时间日期排序,单击表头或右键菜单选择,即可自动排序2:新增 搜索完毕 音效开启或关闭 选项3:资源站点 Sunyaa 由聚合站点改为 ...

  4. 事后Postmortem会议

    会议图片 一.设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我的软件是要建立一个失物招领网站,是一个为校园里的失误招领工作提供便利的平台.我们对 ...

  5. unity入门—五分钟制作一个理论上的游戏

    unity入门 前言:这可不是标题党,虽然都是基础的操作,不过含括了基本的流程,比起脑海中的五花八门的画面,入门还是这个现实一点. 这里插两句,unity国外官网下载会推荐你看一个简短的视频,国内官网 ...

  6. 如何实现OSM地图本地发布并自定义配图

    目录 1.缘起 2.准备环境 2.1.安装linux系统 2.2.安装docker 2.3.安装Docker Compose 2.4.安装git 3.发布地图 3.1.拉取代码 3.2.测试网络 3. ...

  7. 【科技】位运算(bitset)优化最长公共子序列算法

    最长公共子序列(LCS)问题 你有两个字符串 \(A,B\),字符集为 \(\Sigma\),求 \(A, B\) 的最长公共子序列. 简单动态规划 首先有一个广为人知的 dp:\(f_{i,j}\) ...

  8. 深入理解Java虚拟机(八)——类加载机制

    是什么是类加载机制 Java虚拟机将class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程就是类加载机制. 类的生命周期 一个类从加载到内存 ...

  9. elasticsearch的基本了解

     以下内容参考官方文档https://www.elastic.co/guide/en/elasticsearch/reference/7.2/elasticsearch-intro.html 使用的学 ...

  10. Java8的Lambda表达式,你会不?

    目录 理解Lambda 基础语法 函数式接口 常用的函数式接口 消费型接口 供给型接口 断言型接口 函数型接口 方法引用 数组引用 构造器引用 总结 参考阅读 理解Lambda Lambda表达式可以 ...