上篇文章介绍了基于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呢?通过前面的介绍,我们需要增加scopeoffline_access,并且需要设置客户端支持,因此AllowOfflineAccess属性需要设置为True,现在来测试下获取的授权结果。

最终完成了refresh_token的获取,至此整个密码授权模式全部讲解并实现完成。

五、总结及思考

本篇文章我们从密码授权模式使用场景、源码剖析、自定义用户授权来讲解了密码授权模式的详细思路和代码实现,从中不难发现Ids4设计的巧妙,在默认实现的同时也预留了很多自定义扩展,本篇的自定义用户体系也是重新实现接口然后注入就完成集成工作。本篇主要难点就是要理解Ids4的实现思路和数据库的相关配置,希望通过本篇的讲解让我们熟练掌握密码验证的流程,便于应用到实际生产环境。

上篇的客户端授权模式和本篇的密码授权模式都讲解完可能有人会存在以下几个疑问。

  • 1、如何校验令牌信息的有效性?

  • 2、如何强制有效令牌过期?

  • 3、如何实现单机登录?

下篇文章我将会从这3个疑问出发,来详细讲解下这三个问题的实现思路和代码。

相关文章:

  • AspNetCore中使用Ocelot之 IdentityServer4

  • Ocelot-基于.NET Core的开源网关实现

  • .NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权

  • Swagger如何访问Ocelot中带权限验证的API

  • Ocelot.JwtAuthorize:一个基于网关的Jwt验证包

  • .NET Core微服务之基于Ocelot实现API网关服务

  • .NET Core微服务之基于Ocelot实现API网关服务(续)

  • .NET微服务体系结构中为什么使用Ocelot实现API网关

  • Ocelot简易教程(一)之Ocelot是什么

  • Ocelot简易教程(二)之快速开始1

  • Ocelot简易教程(二)之快速开始2

  • Ocelot简易教程(三)之主要特性及路由详解

  • Ocelot简易教程(四)之请求聚合以及服务发现

  • Ocelot简易教程(五)之集成IdentityServer认证以及授权

  • Ocelot简易教程(六)之重写配置文件存储方式并优化响应数据

  • Ocelot简易教程(七)之配置文件数据库存储插件源码解析

  • ASP.NET Core中Ocelot的使用:API网关的应用

  • ASP.NET Core中Ocelot的使用:基于Spring Cloud Netflix Eureka的动态路由

  • ASP.NET Core中Ocelot的使用:基于服务发现的负载均衡

  • 【.NET Core项目实战-统一认证平台】第一章 功能及架构分析

  • 定制Ocelot来满足需求

  • 【.NET Core项目实战-统一认证平台】第三章 网关篇-数据库存储配置(1)

  • 【.NET Core项目实战-统一认证平台】第四章 网关篇-数据库存储配置(2)

  • 【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis

  • 【.NET Core项目实战-统一认证平台】第六章 网关篇-自定义客户端授权

  • 【.NET Core项目实战-统一认证平台】第七章 网关篇-自定义客户端限流

  • 【.NET Core项目实战-统一认证平台】第八章 授权篇-IdentityServer4源码分析

  • 【.NET Core项目实战-统一认证平台】第九章 授权篇-使用Dapper持久化IdentityServer4

  • 【.NET Core项目实战-统一认证平台】第十章 授权篇-客户端授权

原文地址:https://www.cnblogs.com/jackcao/p/10140688.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

【.NET Core项目实战-统一认证平台】第十一章 授权篇-密码授权模式相关推荐

  1. 【.NET Core项目实战-统一认证平台】第九章 授权篇-使用Dapper持久化IdentityServer4...

    上篇文章介绍了IdentityServer4的源码分析的内容,让我们知道了IdentityServer4的一些运行原理,这篇将介绍如何使用dapper来持久化Identityserver4,让我们对I ...

  2. 【.NET Core项目实战-统一认证平台】第一章 功能及架构分析

    从本文开始,我们正式进入项目研发阶段,首先我们分析下统一认证平台应该具备哪些功能性需求和非功能性需求,在梳理完这些需求后,设计好系统采用的架构来满足已有的需求和未来的扩展应用. 1 功能性需求 统一认 ...

  3. 【.NET Core项目实战-统一认证平台】第三章 网关篇-数据库存储配置(1)

    [.NET Core项目实战-统一认证平台]第三章 网关篇-数据库存储配置(1) 原文:[.NET Core项目实战-统一认证平台]第三章 网关篇-数据库存储配置(1) [.NET Core项目实战- ...

  4. 【.NET Core项目实战-统一认证平台】第十四章 授权篇-自定义授权方式

    上篇文章我介绍了如何强制令牌过期的实现,相信大家对IdentityServer4的验证流程有了更深的了解,本篇我将介绍如何使用自定义的授权方式集成老的业务系统验证,然后根据不同的客户端使用不同的认证方 ...

  5. 【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程...

    上篇文章介绍了基于Ids4密码授权模式,从使用场景.原理分析.自定义帐户体系集成完整的介绍了密码授权模式的内容,并最后给出了三个思考问题,本篇就针对第一个思考问题详细的讲解下Ids4是如何生成acce ...

  6. 【.NET Core项目实战-统一认证平台】第十章 授权篇-客户端授权

    上篇文章介绍了如何使用Dapper持久化IdentityServer4(以下简称ids4)的信息,并实现了sqlserver和mysql两种方式存储,本篇将介绍如何使用ids4进行客户端授权. .ne ...

  7. 【.NET Core项目实战-统一认证平台】第八章 授权篇-IdentityServer4源码分析

    上篇文章我介绍了如何在网关上实现客户端自定义限流功能,基本完成了关于网关的一些自定义扩展需求,后面几篇将介绍基于IdentityServer4(后面简称Ids4)的认证相关知识,在具体介绍ids4实现 ...

  8. 【.NET Core项目实战-统一认证平台】第七章 网关篇-自定义客户端限流

    上篇文章我介绍了如何在网关上增加自定义客户端授权功能,从设计到编码实现,一步一步详细讲解,相信大家也掌握了自定义中间件的开发技巧了,本篇我们将介绍如何实现自定义客户端的限流功能,来进一步完善网关的基础 ...

  9. 【.NET Core项目实战-统一认证平台】第六章 网关篇-自定义客户端授权

    上篇文章[.NET Core项目实战-统一认证平台]第五章 网关篇-自定义缓存Redis 我们介绍了网关使用Redis进行缓存,并介绍了如何进行缓存实现,缓存信息清理接口的使用.本篇我们将介绍如何实现 ...

最新文章

  1. oracle 11g duplicate active database 建立物理DG
  2. 历届 SIGGRAPH 上有什么新奇、有趣的项目?
  3. hikaricp 连接池分析_数据库连接池终于搞对了,这次直接从100ms优化到3ms!
  4. 什么是Kubernetes的CRI - 容器运行时接口
  5. 简单存取款机的实现---控制输入变量的规则
  6. 事务没提交的数据查的出来吗?_“金三银四”面试官:说说事务的ACID,什么是脏读、幻读?...
  7. C++基础::函数、类、类型所在的头文件 接口的介绍
  8. 学生选课管理系统(毕业设计)
  9. 北大计算机专业毕业论文,北京大学毕业论文格式范本
  10. DCDC与LDO浅析
  11. ZEMAX 中三种设计优化方法
  12. MyBatis注册映射文件(resource、class、package 三者区别)
  13. 给Testerhome测试小道消息做个硬广告
  14. C# 反序列化错误 System.Runtime.Serialization.SerializationException: 无法找到程序集
  15. Linux平台PPT转图片(Python)
  16. 动画交互应用——星球引力
  17. eureka 手动删除失效的服务
  18. 数据库原理课后答案 第六章
  19. Kali下压缩解压缩命令大全zip、gz、tar、tar.gz、bz2、tar.bz2、bz、tar.bz、Z、tar.Z、taz、tar.tgz、zip、rar、lha
  20. 使用OpenVINOTM对YOLOv5进行INT8量化

热门文章

  1. 电热水器工作过程 c语言,热水器工作流程图
  2. 如何用grep命令同时显示“匹配行”上下的n行?
  3. python引入模块时import与from ... import的区别
  4. 归档日志 delete input 和delete all input 区别
  5. WSUS专题之二:部署与规划1
  6. Avalonia跨平台入门第九篇之控件置顶和置底
  7. 一款强大的Kubernetes API流量查看神器
  8. C# Jpush 极光推送消息推送
  9. 从编译器层面理解C#中的闭包的这个坑!
  10. NoSQL 是否可以用来做日志中心 ?