详解.NET实现OAuth2.0四种模式(6)RefreshToken

2023-11-02

我们知道,为了安全起见,AccessToken的有效时间一般是比较短的(如30分钟)。在AccessToken超出有效期之后,它就不能再用于访问资源,必须重新获得。但如果每30分钟,就要让用户登录一次,那必定会让用户感到厌烦。于是就产生了RefreshToken这个概念。

在获得AccessToken的同时,得到RefreshToken。在AccessToken过期之后,不需要请求用户重新输入账号,直接用RefreshToken获得新的AccessToken。

下面,我们在授权码模式下,加入RefreshToken的实现。

首先,我们需要一个RefreshToken提供类。其跟授权码提供类非常像,具体测试代码如下:

public class RefreshTokenProvider : AuthenticationTokenProvider
{
    private static Dictionary<string, string> tokens = new Dictionary<string, string>();

    public override void Create(AuthenticationTokenCreateContext context)
    {
        context.Ticket.Properties.IssuedUtc = DateTime.UtcNow;
        context.Ticket.Properties.ExpiresUtc = DateTime.UtcNow.AddDays(60);

        context.SetToken(Guid.NewGuid().ToString("n"));
        tokens.Add(context.Token, context.SerializeTicket());
    }

    public override void Receive(AuthenticationTokenReceiveContext context)
    {
        string token = context.Token;
        if (tokens.ContainsKey(token))
        {
            string value = tokens[token];
            tokens.Remove(token);
            context.DeserializeTicket(value);
        }
    }
}

然后,我们需要修改Startup类中的服务器配置,改为:

AllowInsecureHttp = true,//允许http而非https访问
AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,//激活授权码模式
TokenEndpointPath = new PathString("/token"),//访问host/token获取AccessToken
AuthorizeEndpointPath = new PathString("/auth"),//访问host/auth获取授权码
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),//AccessToken在30分钟后过期
Provider = new AuthorizationServerProvider(),//AccessToken的提供类
AuthorizationCodeProvider = new AuthorizationCodeProvider(),//授权码的提供类      
RefreshTokenProvider = new RefreshTokenProvider()//RefreshToken的提供类

其实就是增加了RefreshTokenProvider这一项配置。

在AuthorizationServerProvider类中,ValidateTokenRequest实现Token请求的验证,需要改成如下所示:

public override async Task ValidateTokenRequest(OAuthValidateTokenRequestContext context)
{
    if (context.TokenRequest.IsAuthorizationCodeGrantType)
    {
        context.Validated();
    }
    else if (context.TokenRequest.IsRefreshTokenGrantType)
    {
        context.Validated();
    }
    else
    {
        context.Rejected();
    }
}

这样的话,就同时支持了授权码模式和RefreshToken模式了。

到此为止,对RefreshToken支持的代码已经完成。

RefreshToken请求参数中要求如下:

(1)grant_type,为refresh_token。

(2)refresh_token,为获取AccessToken时得到的RefreshToken。

(3)client_id,客户端ID。

我们使用Postman进行测试。先获取授权码:

使用授权码获取AccessToken和RefreshToken:

使用RefreshToken更新AccessToken:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详解.NET实现OAuth2.0四种模式(6)RefreshToken 的相关文章

随机推荐

  • 第一章:互联网的概述

    第一章 互联网概述 1 互联网是一种计算机网络的集合 以 TCP IP 进行数据通信 把世界各地的计算机网络连接在一起 实现信息交 换和资源共享 互联网是建立在一组共同协议之上的网络设备和线路的物理集合 是一组可共享的资源集 它包括基于 T
  • Java实现数据结构——数组

    数组是一种比较简单的数据结构 而且在大多数高级程序设计语言中都实现了数组 一 无序数组 利用面向过程的思想创建数组 实现数组元素的插入 查找和删除工作 public class Box public static void main Str
  • 软件工程——第12章面向对象实现知识点整理

    本专栏是博主个人笔记 主要目的是利用碎片化的时间来记忆软工知识点 特此声明 文章目录 1 面向对象语言技术的特点
  • MATLAB:用for循环求1、2、……100的和以及用函数文件求前N项和

    MATLAB 用for循环求1 2 100的和以及用函数文件求前N项和 1 A 0 for i 1 100 A A i end A 或 sum 1 100 2 function n A n if n 1 n 1 else n n A n 1
  • iOS UIFont 的学习与使用

    通常 我们使用字体 都是系统默认的字体 有时候 从阅读体验 美观度 设计师都会考虑用一些 更高大尚的字体 系统字体库 给英文 各种style的发挥空间很大 但是 中文则不然 但是苹果 给使用中文的字体的开发者提供了 动态下载字体库的福利 这
  • QT生成.exe安装文件

    QT生成 exe安装文件 找到应用文件的运行的相关文件 1 在QT项目中 使用release进行调试 在release目录下生成 exe文件 release调试目录一般有两种 查看 项目 中的 概要 可以找到release的路径 一般情况下
  • int与byte、byte[]相互转换

    一 int to byte 范围在 128 127之间可以直接转换 超出这个范围就乱了 int i 127 byte b byte i Integer i 127 i byteValue 二 byte to int byte to int
  • docker进入容器出现bash-4.2#解决办法--转载

    docker进入容器显示bash 4 2 如下 root VM 4 15 centos shopmall docker exec it u root 1f654abf60ac bash bash 4 2 出现上述问题是因为在 root 目录
  • 编码规范-枚举管理

    18 枚举 枚举值 一种采用连续序号 0 1 2 3 4 5 6 一种采用二进制位值 0 1 2 4 8 16 还有一种是不规则数字 如串口波特率 枚举值格式 枚举类型变量 枚举类型值 枚举类型说明 枚举值最后标明 默认值 最大值 最小值
  • python交互式解释器下载_python解释器的下载和安装

    1 python解释器的下载 python这样的语言 需要一个解释器 而且解释器还有多种语言的实现 我们介绍的是最常用的C语言的实现 称之为Cpython Python通过在各种操作系统上都有各自的解释器 通过各个操作系统上的解释器 pyt
  • 精选30道Java多线程面试题

    1 线程和进程的区别 2 实现线程有哪几种方式 3 线程有哪几种状态 它们之间如何流转的 4 线程中的start 和run 方法有什么区别 5 怎么终止一个线程 如何优雅地终止线程 6 ThreadLocal在多线程中扮演什么角色 7 线程
  • WEB API 中HTTP的get、post、put,delete 请求方式

    一 WEB API 中HTTP 请求方式的四个主要方法 GET PUT POST DELETE 按照下列方式映射为 CURD 操作 1 POST 用于新建资源 服务端在指定的URI 上创建一个新的对象 将新资源的地址作为响应消息的一部分返回
  • 空间转录组共定位分析的一种方法

    主要是利用了Seurat 里面AddModuleScore函数 View project A33 meta data AddModuleScore ILC1 feature lt list c IL7R CCR6 KLRB1 IFNG IF
  • Dataframe 多行合并为一行

    原表数据 最后4行合并为1行 def ab df return join df values df df groupby 股票代码 股票简称 所属概念 apply ab df df reset index 效果如下 转载于 https ww
  • Qt编译后添加依赖文件到输出目录

    QMAKE POST LINK cp rf PWD lab const 1 xml OUT PWD lab const 1 xml cp rf PWD experiment1 xml OUT PWD experiment1 xml 这个是L
  • Python爬虫必知必会:BeautifulSoup之find_all参数速览

    find all 方法搜索当前tag的所有tag子节点 并判断是否符合过滤器的条件 find all name attrs class recursive string kwargs name 标签名搜索 attrs class 属性 类名
  • *** FATAL ERROR L232: APPLICATION CONTAINS TOO MANY RECURSIONS错误的解决方案

    最近一直在用KEIL写一个单片机的程序 遇到了一个很棘手的无法正常链接的问题 FATAL ERROR L232 APPLICATION CONTAINS TOO MANY RECURSIONS 在网上搜索了大量的文章 以及网页也没找到什么有
  • Redis介绍与使用

    文章目录 一 概念 1 什么是NOSQL 1 1 NOSQL和关系型数据库比较 1 2 非关系型数据库的优势 1 3 关系型数据库的优势 1 4 小结 2 主流的NOSQL产品 3 什么是Redis redis的应用场景 二 下载安装 三
  • rosbag commandline常用命令之filter

    可以实现对已有rosbag文件中的某些topic去除或者保留 rosbag filter input bag output bag topic tf or topic tf and m transforms 0 header frame i
  • 详解.NET实现OAuth2.0四种模式(6)RefreshToken

    我们知道 为了安全起见 AccessToken的有效时间一般是比较短的 如30分钟 在AccessToken超出有效期之后 它就不能再用于访问资源 必须重新获得 但如果每30分钟 就要让用户登录一次 那必定会让用户感到厌烦 于是就产生了Re