一、前言

上面分享了IdentityServer4 两篇系列文章,核心主题主要是密码授权模式自定义授权模式,但是仅仅是分享了这两种模式的使用,这篇文章进一步来分享IdentityServer4的授权流程及refreshtoken

系列文章目录(没看过的先看这几篇文章再来阅读本文章):

  • Asp.Net Core IdentityServer4 中的基本概念

  • Asp.Net Core 中IdentityServer4 授权中心之应用实战

  • Asp.Net Core 中IdentityServer4 授权中心之自定义授权模式

为了继续保持IdentityServer4 系列博客分享上下文一致,我这里再把上回授权中心拆分后的图贴出来,如图:

图中的授权中心就是通过IdentityServer4实现的授权服务中心,我下面就直接用授权中心代替IdentityServer4的授权服务来继续述说,也感谢大家对我的支持,一直阅读我的文章。

二、授权流程

2.1 客户端验证流程图

流程图中,客户端仅仅会到授权中心 请求一次,并拿到验证公钥返回给Api资源拥有端,后面客户端再次尝试请求Api资源时候就不会再到授权中心去获取验证公钥,会直接用之前获取到的公钥进行验证,验证通过则授权通过。

2.2 授权及刷新refresh_token 流程图

然而通过授权中心 获取到的access_token 是有有效时间的,如果失效则需要通过refresh_token 重新到授权中心去刷新获取最新的access_token,整体的流程图如下:

客户端携带上一次获取到的access_token 请求受保护的Api资源时,通过公钥进行验证时发现access_token已经过期,则客户端再携带refresh_token授权中心再次发起请求,刷新access_token以获得最新的access_tokenrefresh_token,用最新的access_token 去获取受保护的Api资源,这样可以减少客户端多次跳转登录授权页面,提高用户体验。

三、应用实战

说到例子,我这里不从零开始撸代码, 还是在之前的代码基础上继续改造代码,在原有的定义客户端的代码中新增刷新access_token的相关配置,代码如下:

public static IEnumerable<Client> GetClients()
{return new List<Client>{new Client(){ClientId =OAuthConfig.UserApi.ClientId,AllowedGrantTypes = new List<string>(){GrantTypes.ResourceOwnerPassword.FirstOrDefault(),//Resource Owner Password模式GrantTypeConstants.ResourceWeixinOpen,},ClientSecrets = {new Secret(OAuthConfig.UserApi.Secret.Sha256()) },AllowOfflineAccess = true,//如果要获取refresh_tokens ,必须把AllowOfflineAccess设置为trueAllowedScopes= {OAuthConfig.UserApi.ApiName,StandardScopes.OfflineAccess,},AccessTokenLifetime = OAuthConfig.ExpireIn,},};}

如果你需要刷新access_token,则需要把AllowOfflineAccess设置true,同时添加StandardScopes.OfflineAccess 这个Scopes,主要代码如下:

AllowOfflineAccess = true,//如果要获取refresh_tokens ,必须把AllowOfflineAccess设置为true
AllowedScopes= {OAuthConfig.UserApi.ApiName,StandardScopes.OfflineAccess,//如果要获取refresh_tokens ,必须在scopes中加上OfflineAccess
},

授权中心,完整代码如下:

OAuthMemoryData 代码如下:

/// <summary>
///
/// </summary>
public class OAuthMemoryData
{/// <summary>/// 资源/// </summary>/// <returns></returns>public static IEnumerable<ApiResource> GetApiResources(){return new List<ApiResource>{new ApiResource(OAuthConfig.UserApi.ApiName,OAuthConfig.UserApi.ApiName),};}public static IEnumerable<Client> GetClients(){return new List<Client>{new Client(){ClientId =OAuthConfig.UserApi.ClientId,AllowedGrantTypes = new List<string>(){GrantTypes.ResourceOwnerPassword.FirstOrDefault(),//Resource Owner Password模式GrantTypeConstants.ResourceWeixinOpen,},ClientSecrets = {new Secret(OAuthConfig.UserApi.Secret.Sha256()) },AllowOfflineAccess = true,//如果要获取refresh_tokens ,必须把AllowOfflineAccess设置为trueAllowedScopes= {OAuthConfig.UserApi.ApiName,StandardScopes.OfflineAccess,},AccessTokenLifetime = OAuthConfig.ExpireIn,},};}/// <summary>/// 测试的账号和密码/// </summary>/// <returns></returns>public static List<TestUser> GetTestUsers(){return new List<TestUser>{new TestUser(){SubjectId = "1",Username = "test",Password = "123456"},};}/// <summary>/// 微信openId 的测试用户/// </summary>/// <returns></returns>public static List<TestUser> GetWeiXinOpenIdTestUsers(){return new List<TestUser>{new TestUser(){SubjectId="owerhwroogs3902openId",}};}
}

Startup 完整代码如下:

 public class Startup{public Startup(IConfiguration configuration){Configuration = configuration;}public IConfiguration Configuration { get; }// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services){services.AddControllers();services.Configure<CookiePolicyOptions>(options =>{// This lambda determines whether user consent for non-essential cookies is needed for a given request.options.CheckConsentNeeded = context => true;options.MinimumSameSitePolicy = SameSiteMode.None;});#region 内存方式//services.AddIdentityServer()//    .AddDeveloperSigningCredential()//    .AddInMemoryApiResources(OAuthMemoryData.GetApiResources())//    .AddInMemoryClients(OAuthMemoryData.GetClients())//    .AddTestUsers(OAuthMemoryData.GetTestUsers());#endregion#region 数据库存储方式services.AddIdentityServer().AddDeveloperSigningCredential().AddInMemoryApiResources(OAuthMemoryData.GetApiResources())//.AddInMemoryClients(OAuthMemoryData.GetClients()).AddClientStore<ClientStore>().AddResourceOwnerValidator<ResourceOwnerPasswordValidator>().AddExtensionGrantValidator<WeiXinOpenGrantValidator>();//添加微信端自定义方式的验证#endregion}// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseIdentityServer();app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});}
}

授权中心代码基本上已经改造完成,我们用postman 访问授权中心 试一试,如下图:访问结果中已经包含了refresh_tokenaccess_token等相关信息。

我们再来通过access_token 访问Api资源(上两篇有相关代码,未阅读上两篇先去查阅)这里我就直接携带access_token去访问,如图:

访问成功!!

我们再来刷新下refresh_token ,访问如图:

刷新refresh_token成功。我们到这里再来做一个小小的测试,测试上面的授权流程中的,第4,5 步,上面说到第4步主要是客户端第一次请求Api资源时会向ids4服务网关去请求获取验证公钥, 获取成功返回给Api资源并存储在内存中,后续不再会到ids4服务去获取验证公钥

我们把上面的授权中心 (ids4服务网关)停止运行,再来用之前的access_token请求Api资源,如下图:现在已经确定授权中心(ids4服务网关)确实停止了,不能访问了,那我们再来通过之前未过期的access_token来请求Api资源网关,结果如下图:

完美,请求还是成功,这完全证明:客户端请求Api资源网关(受保护的资源)时,第一次收到请求会到授权中心(ids4服务网关)获取验证公钥,并保持到内存中,后面的请求不会再到授权中心去获得验证公钥,而是Api资源网关(受保护的资源)中直接通过保存下来的验证公钥进行验证,从而通过授权

·end·

dotNET博士

长按关注,一起学习分享技术

♥ 给个[在看],是对我最大的支持 ♥

Asp.Net Core 中IdentityServer4 授权流程及刷新Token相关推荐

  1. Asp.Net Core 中IdentityServer4 授权中心之自定义授权模式

    一.前言 上一篇我分享了一篇关于 Asp.Net Core 中IdentityServer4 授权中心之应用实战的文章,其中有不少博友给我提了问题,其中有一个博友问我的一个场景,我给他解答的还不够完美 ...

  2. Asp.Net Core 中IdentityServer4 授权中心之应用实战

    一.前言 查阅了大多数相关资料,搜索到的IdentityServer4 的应用文章大多是比较简单并且多是翻译官网的文档编写的,我这里在 Asp.Net Core 中IdentityServer4 的应 ...

  3. Asp.Net Core 中IdentityServer4 实战之 Claim详解

    一.前言 由于疫情原因,让我开始了以博客的方式来学习和分享技术(持续分享的过程也是自己学习成长的过程),同时也让更多的初学者学习到相关知识,如果我的文章中有分析不到位的地方,还请大家多多指教:以后我会 ...

  4. Asp.Net Core 中IdentityServer4 实战之角色授权详解

    一.前言 前几篇文章分享了IdentityServer4密码模式的基本授权及自定义授权等方式,最近由于改造一个网关服务,也用到了IdentityServer4的授权,改造过程中发现比较适合基于Role ...

  5. .net授权获取openid_Asp.Net Core 中IdentityServer4 授权中心之自定义授权

    一.前言 上一篇我分享了一篇关于 Asp.Net Core 中IdentityServer4 授权中心之应用实战 的文章,其中有不少博友给我提了问题,其中有一个博友问我的一个场景,我给他解答的还不够完 ...

  6. 静默授权获取unionid_Asp.Net Core 中IdentityServer4 授权中心之自定义授权

    一.前言 上一篇我分享了一篇关于 Asp.Net Core 中IdentityServer4 授权中心之应用实战 的文章,其中有不少博友给我提了问题,其中有一个博友问我的一个场景,我给他解答的还不够完 ...

  7. ASP.NET Core 认证与授权[2]:Cookie认证

    ASP.NET Core 认证与授权[2]:Cookie认证 原文:ASP.NET Core 认证与授权[2]:Cookie认证 由于HTTP协议是无状态的,但对于认证来说,必然要通过一种机制来保存用 ...

  8. ASP.NET Core 认证与授权[6]:授权策略是怎么执行的?

    ASP.NET Core 认证与授权[6]:授权策略是怎么执行的? 原文:ASP.NET Core 认证与授权[6]:授权策略是怎么执行的? 在上一章中,详细介绍了 ASP.NET Core 中的授权 ...

  9. ASP.NET Core 认证与授权[5]:初识授权

    经过前面几章的姗姗学步,我们了解了在 ASP.NET Core 中是如何认证的,终于来到了授权阶段.在认证阶段我们通过用户令牌获取到用户的Claims,而授权便是对这些的Claims的验证,如:是否拥 ...

最新文章

  1. 一起谈.NET技术,.Net Discovery系列之-深入理解平台机制与性能影响 (中)
  2. 合作伙伴常见技术问题集锦
  3. 可变悬挂与空气悬挂的区别_可变悬架和空气悬架的的区别是什么
  4. 【NLP】一文搞懂NLP中的对抗训练
  5. win7下mongodb 2.6安装方法
  6. PHP会话控制考察点
  7. 对ContentProvider中getType方法的一点理解
  8. java二维数组排序先行后列,数组知识点归纳
  9. html5播放器 迅雷,搜狗浏览器HTML5视频播放器插件(HTML5.Video.Player)
  10. 初学java小白的疑惑梳理
  11. 本田与索尼宣布将成立合资企业 计划2025年开始销售电动汽车
  12. Python 编程规范 —— TODO 注释(结合 PyCharm)
  13. cocos2dx lua 打印和保存日志
  14. c#基础学习@--1--
  15. Atitit  自动化gui 与 发帖机 技术
  16. php-5.4 升级到 php7.2
  17. 什么是云计算?云计算概念集合
  18. 操作系统的另类安装---如何抛开光盘安装系统
  19. Word中常见的论文三线表(表格)制作
  20. 【C语言】博客之旅从学习C语言开始

热门文章

  1. IE6下margin-left双倍bug问题
  2. TCP/IP 协议简单分析(建立连接握手过程)
  3. [导入]Asp.net中动态在中加入Scrpit标签
  4. java input回车,用java怎样编写加减乘除,从键盘输入,例如:1+2按回车得到
  5. Unity3D学习笔记之九为场景添加细节(二)
  6. 找call写call_如何将Google Call Widget添加到任何网页
  7. 物体成瘾性_科技成瘾使我们不那么快乐。 那是一个市场机会。
  8. linux 桌面显示视频播放器,Ubuntu 13.10开启媒体播放器VLC桌面通知的步骤
  9. 洛谷P5055 【模板】可持久化文艺平衡树(FHQ Treap)
  10. Python基础教程:Python pass语句详解