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 流程

流程简要说明:
- 首先用户和客户端需要提前在授权服务器上备案过的,用户没有备案,在资源服务器肯定就没有对应的资源,客户端没有备案就不能随意去授权服务器获取AccessToken;
- 用户在客户端上输入用户名和密码,并带上备案过的客户端凭据一起请求授权服务器获取AccessToken;
- 授权服务器验证用户凭据和客户端凭据,成功之后直接返回代表该用户的AccessToken;
- 用户在操作时,带上AccessToken访问资源服务器;
- 资源服务器正常返回结果,如果没有AccessToken是不能访问受保护资源的;
结合流程,看看代码如何实现,步伐跟上哦;
这里资源服务器和授权服务器就拷贝之前客户端模式的代码(这样每种模式的代码区分开,方便查看),在原有基础上修改代码即可;
代码地址:https://github.com/zyq025/IDS4Demo
>>在原有的授权服务器上增加代码
模拟在授权服务器中备案用户,方便测试效果,就在内存中模拟;

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

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

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

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

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

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

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

以上就是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 其实有点尴尬的更多相关文章
- IdentityServer4之Resource Owner Password Credentials(资源拥有者密码凭据许可)
IdentityServer4之Resource Owner Password Credentials(资源拥有者密码凭据许可) 参考 官方文档:2_resource_owner_passwords ...
- asp.net core IdentityServer4 实现 resource owner password credentials(密码凭证)
前言 OAuth 2.0默认四种授权模式(GrantType) 授权码模式(authorization_code) 简化模式(implicit) 密码模式(resource owner passwor ...
- 不要使用Resource Owner Password Credentials
不要使用Resource Owner Password Credentials 文章链接在这里 前言 最近公司项目在做一些重构,因为公司多个业务系统各自实现了一套登录逻辑,比较混乱.所以,现在需要做一 ...
- 使用Resource Owner Password Credentials Grant授权发放Token
对应的应用场景是:为自家的网站开发手机 App(非第三方 App),只需用户在 App 上登录,无需用户对 App 所能访问的数据进行授权. 客户端获取Token: public string Get ...
- 基于 IdentityServer3 实现 OAuth 2.0 授权服务【密码模式(Resource Owner Password Credentials)】
密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码.客户端使用这些信息,向"服务商提供商"索要授权 ...
- 基于OWIN WebAPI 使用OAuth授权服务【客户端验证授权(Resource Owner Password Credentials Grant)】
适用范围 前面介绍了Client Credentials Grant ,只适合客户端的模式来使用,不涉及用户相关.而Resource Owner Password Credentials Grant模 ...
- OAuth2.0学习(1-6)授权方式3-密码模式(Resource Owner Password Credentials Grant)
授权方式3-密码模式(Resource Owner Password Credentials Grant) 密码模式(Resource Owner Password Credentials Grant ...
- IdentityServer4专题之六:Resource Owner Password Credentials
实现代码: (1)IdentityServer4授权服务器代码: public static class Config { public static IEnumerable<Identity ...
- ABP中使用OAuth2(Resource Owner Password Credentials Grant模式)
ABP目前的认证方式有两种,一种是基于Cookie的登录认证,一种是基于token的登录认证.使用Cookie的认证方式一般在PC端用得比较多,使用token的认证方式一般在移动端用得比较多.ABP自 ...
随机推荐
- Linux 挂载,卸载光盘
首先我们点击虚拟机 点击设置 选择CD 接着我们将设备状态两个勾都勾选,并且ISO映像文件选择我们需要挂载的光盘 点击了确定之后,我们到centos7的命令行下 1,创建挂载目录 mkdir /mnt ...
- 项目测试环境自动化部署[jenkins前后端配置、Nginx配置]
持续部署:关注点在于项目功能部署到服务器后可以正常运行,为下一步测试环节或最终用户正式使用做准备.(问题点:一个环节有问题,其他环节跟着有问题) 持续集成:关注点是在于尽早发现项目整体运行问题,尽早解 ...
- Springboot中redisTemplate乱码或json转换问题
问题1 用RedisTemplate存入map值的时候,用rdm可视化打开,看到的是转码之后的数据,如图: 存入的方法为: public boolean hmset(String key, Map&l ...
- MySQL入门看这一篇就够了
MySQL JavaEE:企业级Java开发 web阶段 分为1.前端(页面,展示数据库中的数据) 2.后台(连接点:链接数据库JDBC.Mybatis,链接前端(控制视图跳转,给前端传递数据)) 3 ...
- 优化 Webpack 的构建速度
1.使用高版本的 Webpack 和 Node.js 2.多进程/多实例构建:HappyPack(不维护了).thread-loader 3.压缩代码 webpack-paralle-uglify-p ...
- AcWing 276. I-区域
题目链接 设 \(0\) 为单调伸长, \(1\) 为单调伸短. 设 \(f[i][j][l][r][x(0 / 1)][y (0 / 1)]\) 为第 \(i\) 行,已经选出\(j\)个格子,第\ ...
- 深入理解Java虚拟机(九)——后端编译与优化
即时编译器 Java程序最初都是通过解释器进行执行,当发现某个方法或者代码块被运行得非常频繁,这些代码就被认为是热点代码,为了提高这些代码得运行效率,虚拟机会把热点代码编译成本地机器码,并进行优化,运 ...
- Oracle 迁移数据库到 mysql
一. oracle导出.sql文件(Navicat Premiu 11.0.8 无法实现oracle到mysql的数据传输亲测有效) exp username/pass@数据局地址ip:1521/ ...
- 剑指Java高效编程教程
教程介绍 所谓"武以快为尊,天下武功唯快不破".本课程剑指Java高效编程,致力于从"技术"和"工具"两大 维度提高编程效率,帮助广大程序员 ...
- strin 字符串的内置函数
count("x")统计字符串的元素的个数 a = "hello kitty" print (a.count("t"))#统计t出现的个数 ...