【.NET Core项目实战-统一认证平台】第十一章 授权篇-密码授权模式
上篇文章介绍了基于
Ids4客户端授权的原理及如何实现自定义的客户端授权,并配合网关实现了统一的授权异常返回值和权限配置等相关功能,本篇将介绍密码授权模式,从使用场景、源码剖析到具体实现详细讲解密码授权模式的相关应用。.netcore项目实战交流群(637326624),有兴趣的朋友可以在群里交流讨论。
一、使用场景?
由于密码授权模式需要用户在业务系统输入账号密码,为了安全起见,对于使用密码模式的业务系统,我们认为是绝对可靠的,不存在泄漏用户名和密码的风险,所以使用场景定位为公司内部系统或集团内部系统或公司内部app等内部应用,非内部应用,尽量不要开启密码授权模式,防止用户账户泄漏。
这种模式适用于用户对应用程序高度信任的情况。比如是用户系统的一部分。
二、Ids4密码模式的默认实现剖析
在我们使用密码授权模式之前,我们需要理解密码模式是如何实现的,在上一篇中,我介绍了客户端授权的实现及源码剖析,相信我们已经对
Ids4客户端授权已经熟悉,今天继续分析密码模式是如何获取到令牌的。
Ids4的所有授权都在
TokenEndpoint方法中,密码模式授权也是先校验客户端授权,如果客户端校验失败,直接返回删除信息,如果客户端校验成功,继续校验用户名和密码,详细实现代码如下。
1、校验是否存在
grantType
,然后根据不同的类型启用不同的校验方式。
2、启用密码授权模式校验规则,首先校验传输的参数和
scope是否存在,然后校验用户名密码是否准确,最后校验用户是否可用。
3、运行自定义上下文验证
通过源码剖析可以发现,
Ids4
给了我们很多的验证方式,并且默认也实现的验证和自定义的扩展,这样如果我们需要使用密码授权模式,就可以重写IResourceOwnerPasswordValidator
来实现系统内部用户系统的验证需求。如果需要确认用户在登录以后是否被注销时,可以重写IProfileService
接口实现,这个验证主要是生成token校验时检查。
4、最终生成Token
根据不同的授权模式,生成不同的token记录。
根据请求的
scope判断是否生成
refreshToken,如果标记了
offline_access,则生成
refreshToken,否则不生成。 5、RefreshToken持久化
当我们使用了
offline_access时,就需要生成
RefreshToken并进行持久化,详细的实现代码如下。
至此,我们整个密码授权模式全部讲解完成,相信大家跟我一样完全掌握了授权的整个流程,如果需要持久化如何进行持久化流程。
理解了完整的密码授权模式流程后,使用自定义的用户体系就得心应手了,下面就开始完整的实现自定义帐户授权。
三、设计自定义的账户信息并应用
为了演示方便,我这里就设计简单的用户帐户信息,作为自定义的哦帐户基础,如果正式环境中使用,请根据各自业务使用各自的帐户体系即可。下面开始密码授权模式开发,首先需要重新实现
IResourceOwnerPasswordValidator接口,使用我们定义的用户表来验证请求的用户名和密码信息。
编写完自定义校验后,我们需要注入到具体的实现,详细代码如下。
剩下的就是把
ICzarUsersServices接口实现并注入即可。详细代码如下。
最后我们实现仓储接口和方法,即可完成校验流程。
现在万事俱备,之前注入和插入测试用户数据进行测试了,为了方便注入,我们采用
autofac程序集注册。
然后需要修改
ConfigureServices代码如下,就完成了仓储和服务层的注入。 为了验证密码授权模式信息,这里需要往数据库插入测试的用户数据,插入脚本如下。
--密码123456 MD5加密结果INSERT INTO CzarUsers VALUES('13888888888','E10ADC3949BA59ABBE56E057F20F883E','金焰的世界','13888888888','541869544@qq.com',1);
四、测试密码授权模式
注意:测试密码授权模式之前,我们需要对测试的客户端ClientGrantTypes
表添加password
授权方式。
打开我们的测试神器
Postman,然后开始调试密码授权模式,测试结果如下图所示。
是不是很完美,得到了我们想要的授权结果,那我们查看下这个access_token是什么信息,可以使用https://jwt.io/查看到详细的内容,发现除了客户端信息和用户主键无其他附加信息,那如何添加自定义的Claim信息呢?
先修改下
CzarUsers实体,增加如下代码,如果有其他属性可自行扩展。 然后需要把用户的claims应用到Token,这里我们需要重写
IProfileService,然后把用户的claim输出,实现代码如下。 然后别忘了注入
.AddProfileService<CzarProfileService>(),好了现在我们再次测试下授权,最终得到的结果如下所示。
奈斯,得到了我们预期授权结果。
那如何获取
refresh_token呢?通过前面的介绍,我们需要增加
scope为
offline_access,并且需要设置客户端支持,因此
AllowOfflineAccess属性需要设置为
True,现在来测试下获取的授权结果。
最终完成了
refresh_token的获取,至此整个密码授权模式全部讲解并实现完成。
五、总结及思考
本篇文章我们从密码授权模式使用场景、源码剖析、自定义用户授权来讲解了密码授权模式的详细思路和代码实现,从中不难发现
Ids4设计的巧妙,在默认实现的同时也预留了很多自定义扩展,本篇的自定义用户体系也是重新实现接口然后注入就完成集成工作。本篇主要难点就是要理解
Ids4的实现思路和数据库的相关配置,希望通过本篇的讲解让我们熟练掌握密码验证的流程,便于应用到实际生产环境。
上篇的客户端授权模式和本篇的密码授权模式都讲解完可能有人会存在以下几个疑问。
1、如何校验令牌信息的有效性?
2、如何强制有效令牌过期?
3、如何实现单机登录?
下篇文章我将会从这3个疑问出发,来详细讲解下这三个问题的实现思路和代码。相关文章:
原文地址:https://www.cnblogs.com/jackcao/p/10140688.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
- 【.NET Core项目实战-统一认证平台】第十章 授权篇-客户端授权
- 【.NET Core项目实战-统一认证平台】第十章 授权篇-客户端授权
- 【.NET Core项目实战-统一认证平台】第二章网关篇-重构Ocelot来满足需求
- 【.NET Core项目实战-统一认证平台】第一章 功能及架构分析
- 【.NET Core项目实战-统一认证平台】第四章 网关篇-数据库存储配置(2)
- 【.NET Core项目实战-统一认证平台】第三章 网关篇-数据库存储配置(1)
- 【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis
- STS创建Spring Boot项目实战(Rest接口、数据库、用户认证、分布式Token JWT、Redis操作、日志和统一异常处理)
- .NET Core实战项目之CMS 第十一章 开发篇-数据库生成及实体代码生成器开发
- 权限服务、云平台、认证授权项目之间的关系
- Spring cloud微服务实战——基于OAUTH2.0统一认证授权的微服务基础架构
- 微软WCF应用高级进阶(分布式+异步调用+安全+通信模式)配销售管理平台项目实战
- Spring Boot整合oauth2.0搭建统一授权服务(密码模式)
- 【ASP.NET Core分布式项目实战】(一)IdentityServer4登录中心、oauth密码模式identity server4实现
- STS创建Spring Boot项目实战(Rest接口、数据库、用户认证、分布式Token JWT、Redis操作、日志和统一异常处理)
- Node.js项目实战-构建可扩展的Web应用(第一版): 6 在Node.js应用中使用session和OAuth进行用户认证和授权
- 【.NET Core微服务实战-统一身份认证】开篇及目录索引
- 统一认证与授权在微服务架构中的设计与实战
- Spring cloud微服务实战——基于OAUTH2.0统一认证授权的微服务基础架构
- STS创建Spring Boot项目实战(Rest接口、数据库、用户认证、分布式Token JWT、Redis操作、日志和统一异常处理)