Asp.Net Core 中IdentityServer4 授权流程及刷新Token
一、前言
上面分享了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_token
和refresh_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_token
和access_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相关推荐
- Asp.Net Core 中IdentityServer4 授权中心之自定义授权模式
一.前言 上一篇我分享了一篇关于 Asp.Net Core 中IdentityServer4 授权中心之应用实战的文章,其中有不少博友给我提了问题,其中有一个博友问我的一个场景,我给他解答的还不够完美 ...
- Asp.Net Core 中IdentityServer4 授权中心之应用实战
一.前言 查阅了大多数相关资料,搜索到的IdentityServer4 的应用文章大多是比较简单并且多是翻译官网的文档编写的,我这里在 Asp.Net Core 中IdentityServer4 的应 ...
- Asp.Net Core 中IdentityServer4 实战之 Claim详解
一.前言 由于疫情原因,让我开始了以博客的方式来学习和分享技术(持续分享的过程也是自己学习成长的过程),同时也让更多的初学者学习到相关知识,如果我的文章中有分析不到位的地方,还请大家多多指教:以后我会 ...
- Asp.Net Core 中IdentityServer4 实战之角色授权详解
一.前言 前几篇文章分享了IdentityServer4密码模式的基本授权及自定义授权等方式,最近由于改造一个网关服务,也用到了IdentityServer4的授权,改造过程中发现比较适合基于Role ...
- .net授权获取openid_Asp.Net Core 中IdentityServer4 授权中心之自定义授权
一.前言 上一篇我分享了一篇关于 Asp.Net Core 中IdentityServer4 授权中心之应用实战 的文章,其中有不少博友给我提了问题,其中有一个博友问我的一个场景,我给他解答的还不够完 ...
- 静默授权获取unionid_Asp.Net Core 中IdentityServer4 授权中心之自定义授权
一.前言 上一篇我分享了一篇关于 Asp.Net Core 中IdentityServer4 授权中心之应用实战 的文章,其中有不少博友给我提了问题,其中有一个博友问我的一个场景,我给他解答的还不够完 ...
- ASP.NET Core 认证与授权[2]:Cookie认证
ASP.NET Core 认证与授权[2]:Cookie认证 原文:ASP.NET Core 认证与授权[2]:Cookie认证 由于HTTP协议是无状态的,但对于认证来说,必然要通过一种机制来保存用 ...
- ASP.NET Core 认证与授权[6]:授权策略是怎么执行的?
ASP.NET Core 认证与授权[6]:授权策略是怎么执行的? 原文:ASP.NET Core 认证与授权[6]:授权策略是怎么执行的? 在上一章中,详细介绍了 ASP.NET Core 中的授权 ...
- ASP.NET Core 认证与授权[5]:初识授权
经过前面几章的姗姗学步,我们了解了在 ASP.NET Core 中是如何认证的,终于来到了授权阶段.在认证阶段我们通过用户令牌获取到用户的Claims,而授权便是对这些的Claims的验证,如:是否拥 ...
最新文章
- 一起谈.NET技术,.Net Discovery系列之-深入理解平台机制与性能影响 (中)
- 合作伙伴常见技术问题集锦
- 可变悬挂与空气悬挂的区别_可变悬架和空气悬架的的区别是什么
- 【NLP】一文搞懂NLP中的对抗训练
- win7下mongodb 2.6安装方法
- PHP会话控制考察点
- 对ContentProvider中getType方法的一点理解
- java二维数组排序先行后列,数组知识点归纳
- html5播放器 迅雷,搜狗浏览器HTML5视频播放器插件(HTML5.Video.Player)
- 初学java小白的疑惑梳理
- 本田与索尼宣布将成立合资企业 计划2025年开始销售电动汽车
- Python 编程规范 —— TODO 注释(结合 PyCharm)
- cocos2dx lua 打印和保存日志
- c#基础学习@--1--
- Atitit 自动化gui 与 发帖机 技术
- php-5.4 升级到 php7.2
- 什么是云计算?云计算概念集合
- 操作系统的另类安装---如何抛开光盘安装系统
- Word中常见的论文三线表(表格)制作
- 【C语言】博客之旅从学习C语言开始
热门文章
- IE6下margin-left双倍bug问题
- TCP/IP 协议简单分析(建立连接握手过程)
- [导入]Asp.net中动态在中加入Scrpit标签
- java input回车,用java怎样编写加减乘除,从键盘输入,例如:1+2按回车得到
- Unity3D学习笔记之九为场景添加细节(二)
- 找call写call_如何将Google Call Widget添加到任何网页
- 物体成瘾性_科技成瘾使我们不那么快乐。 那是一个市场机会。
- linux 桌面显示视频播放器,Ubuntu 13.10开启媒体播放器VLC桌面通知的步骤
- 洛谷P5055 【模板】可持久化文艺平衡树(FHQ Treap)
- Python基础教程:Python pass语句详解