Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何读取已过期的JWT令牌

如何读取已过期的JWT令牌
EN

Stack Overflow用户
提问于 2018-02-09 05:45:02
回答 1查看 3.7K关注 0票数 3

我在我的ASP.NET Core2WebAPI项目中使用JWT令牌

我的前端web客户端发送一个JWT令牌,它最初是从Web登录API获得的,每个请求都正常工作。不过,我还有一个离线客户端,它使用相同的API,最初在线登录,然后存储JWT脱机,只有在用户同步应用程序时才发送它,这可能会在一周后。令牌可能已经过期,或者服务器web应用程序在规定的时间内重新启动。

如果JWT令牌由于离线客户端过期而失败,我仍然希望命中Web控制器方法并填充ASP.NET Identity User对象,因为我需要用户名。我将记录这个事件,但我也需要来自过期/无效令牌的用户名。当前,如果身份验证失败,控制器方法将不会被输入,因此我添加了一个AllowAnonymous属性,但是这将导致User.Identity为空,因为我需要用户名

我的代码:

Startup.cs

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public void ConfigureServices(IServiceCollection services)
    {

        services.AddAuthentication()
            .AddJwtBearer(cfg =>
            {
                cfg.TokenValidationParameters = new TokenValidationParameters()
                {
                    ValidIssuer = _config["Tokens:Issuer"],
                    ValidAudience = _config["Tokens:Audience"],
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Tokens:Key"]))
                };

            });

当用户登录时

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   private IActionResult CreateToken(ApplicationUser user, IList<string> roles)
    {
        var claims = new List<Claim>
        {
          new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
          new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
          new Claim(JwtRegisteredClaimNames.UniqueName, user.UserName)
        };



        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Tokens:Key"]));

        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

        var token = new JwtSecurityToken(
          _config["Tokens:Issuer"],
          _config["Tokens:Audience"],
          claims.ToArray(),
         expires: DateTime.Now.AddMinutes(60),
          signingCredentials: creds);

        var results = new
        {
            token = new JwtSecurityTokenHandler().WriteToken(token),
            expiration = token.ValidTo,
        };

        return Created("", results);

我确保在对各种API调用进行身份验证之后,传递JWT令牌。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
 public class MyController : Controller
{

这允许我为各种API调用捕获登录用户的以下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 var loggedInUser = User.Identity.Name;

如果用户名已过期或无效,如何从JWT令牌读取用户名?

EN

回答 1

Stack Overflow用户

发布于 2018-02-09 10:43:55

如果您希望授权通过,即使令牌已经过期,您可以简单地通过将它添加到TokenValidationParameters来禁用生存期验证

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
services.AddAuthentication()
        .AddJwtBearer(cfg =>
        {
            cfg.TokenValidationParameters = new TokenValidationParameters()
            {
                ValidIssuer = _config["Tokens:Issuer"],
                ValidAudience = _config["Tokens:Audience"],
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Tokens:Key"]))

                //Do not check the expiry of token
                ValidateLifetime = false,
            };

        });

这将确保授权中间件认为令牌是有效的,并在MVC中间件中填充User.Identity对象。

然而,此检查也将禁用您的web客户端的过期检查。您必须确定适当的客户端(不能确定),并在控制器中检查是否过期。

一个更好的方法是看一个更好的设计来解决你的基本需求。

令牌可能已经过期,或者服务器web应用程序在规定的时间内重新启动。

我对这句话有点困惑。如果服务器web应用程序在平均时间内重新启动,并且遇到令牌过期,我假设您正在使用临时签名密钥对JWT令牌进行签名。您应该切换到使用永久签名密钥。

对于脱机客户端(您想要长寿令牌),请查看刷新令牌。刷新令牌通常具有较长的生存期,可用于为较新的访问令牌进行交换。当指定范围offline_access时,标准的oauth2.0实现会发出刷新令牌。作用域的名称应该指示刷新令牌的通用用例。

您可以将web客户端和脱机客户端配置为您的Authority Server上的两个不同客户端,从而确保只向脱机客户端发出刷新令牌。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48707281

复制
相关文章
[随缘一题]平面列表
给定一个列表,该列表中的每个要素要么是个列表,要么是整数。将其变成一个只包含整数的简单列表。
呼延十
2019/07/01
5040
LintCode 平面列表题目分析代码
给定一个列表,该列表中的每个要素要么是个列表,要么是整数。将其变成一个只包含整数的简单列表。 ** 注意事项 ** 如果给定的列表中的要素本身也是一个列表,那么它也可以包含列表。 样例 给定 [1,2,[1,2]],返回 [1,2,1,2]。 给定 [4,[3,[2,[1]]]],返回 [4,3,2,1]。
desperate633
2018/08/22
3020
如何在Dart中合并列表
在 Dart 编程中,List 数据类型类似于其他编程语言中的数组。列表用于表示对象的集合。它是一组有序的对象。Dart 中的核心库负责 List 类的存在、创建和操作。有 5 种方法可以组合两个或多个列表:
徐建国
2021/12/01
2.1K0
fastadmin如何在列表的操作中添加其他按钮
fastadmin默认的列表操作中只有编辑和删除按钮,如果我们需要添加其他按钮,需要先找到对应的js文件。我们需要在初始化表格中添加buutons属性,原来的js代码如下:
高久峰
2023/06/03
4.3K0
如何在列表,字典、集合中筛选数据——进阶学习
我们先生成一个字典,比如生成班上学上的成绩,班上有10个人,我们要进行筛选分数及格的同学
Gorit
2021/12/09
2.2K0
如何在列表,字典、集合中筛选数据——进阶学习
如何在 Python 中以表格格式打印列表?
在 Python 中,列表是一种常见的数据结构,用于存储和组织数据。当我们需要将列表的内容以表格形式展示时,可以通过特定的方法和技巧来实现。本文将详细介绍如何在 Python 中以表格格式打印列表,以便更好地展示和呈现数据。
网络技术联盟站
2023/06/01
1.6K0
如何在CSS中自定义鼠标样式
想着美化下自己的个人部落格,那就先从鼠标样式开始美化吧,默认的鼠标样式有点单调,那应该如何美化呢?
用户1094633
2022/02/14
2.3K0
【说站】Python如何在列表中添加新值
1、append()将元素添加到集合,insert()将元素插入指定的下标应用程序,返回值为None。
很酷的站长
2022/11/24
4.1K0
【说站】Python如何在列表中添加新值
如何在Vscode中安装Python库
检查是否正确配置好运行环境,按Windows+R组合键在运行窗口输入cmd,打开命令提示符窗口输入python确定即可
程序员鑫港
2022/01/11
2.5K0
如何在Vscode中安装Python库
检查是否正确配置好运行环境,按Windows+R组合键在运行窗口输入cmd,打开命令提示符窗口输入python确定即可
程序员鑫港
2021/12/23
7.1K0
如何在SwiftUI中实现interactiveDismissDisabled
由于健康笔记[2]中数据录入都是在Sheet中进行的,为了防止用户在录入过程中由于误操作(使用手势取消Sheet)丢失数据,因此,从最初的版本开始,我就一直使用各种手段加强对Sheet的控制。
东坡肘子
2022/07/28
3.9K0
如何在SwiftUI中实现interactiveDismissDisabled
如何在 MongoDB 中实现事务
在 MongoDB 中,事务可以用于在一个或多个集合上执行多个操作。事务可以帮助确保数据的一致性和可靠性。
玖叁叁
2023/04/14
2.6K0
【HTML】HTML 列表 ( 无序列表 | 有序列表 | 自定义列表 )
列表 由于其 整齐 , 整洁 , 有序 的特征 , 类似于表格 , 但是其 组合的自由程度高于表格 , 经常用来进行布局 ;
韩曙亮
2023/03/30
3K0
【HTML】HTML 列表 ( 无序列表 | 有序列表 | 自定义列表 )
如何在 Python 中计算列表中的唯一值?
Python 提供了各种方法来操作列表,这是最常用的数据结构之一。使用列表时的一项常见任务是计算其中唯一值的出现次数,这在数据分析、处理和筛选任务中通常是必需的。在本文中,我们将探讨四种不同的方法来计算 Python 列表中的唯一值。
很酷的站长
2023/08/11
3890
如何在 Python 中计算列表中的唯一值?
html 有序列表、无序列表、自定义列表
HTML有一个特殊元素,用于创建ordered lists(有序列表), 或数字编号列表。 有序列表以<ol>元素开始,并包含一个或多个<li>元素。 例如:
Devops海洋的渔夫
2019/05/31
4.1K0
在iview中实现列表远程排序
iview中可以通过给列表中每个字段设置sortable: true可以实现字段排序,但是当列表中的数据量比较多时,列表中会有分页,此时只能对当前页进行排序,针对这个问题,iview中有一个远程排序功能,可以通过远程排序实现多页数据的排序
用户3880999
2023/04/13
1.9K0
在iview中实现列表远程排序
列表(List)中数组实现(ArrayList类)
同样基于数组实现,会在内存中开辟一块连续的空间来存储。ArrayList是非线程安全的,效率高;Vector是基于线程安全的,但效率低,并且是方法级别的同步,不是绝对的线程安全。   初始容量10,每次数组扩展到原来容量的2倍(每次扩充的容量大小是可以设置的,而ArrayList类不支持设定)。
用户7999227
2021/10/07
9400
点击加载更多

相似问题

如何在自定义类中实现映射/平面映射

13

如何在列表上实现此筛选

11

如何在ExtJS中实现此自定义网格?

10

如何在Django中实现此数据库模型?

11

如何在tensorflow中实现此自定义损失函数?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文