如何使 Identity Core 生成的访问令牌失效?

2023-12-28

我在 .Net5 应用程序上实现了 Identity Core,以处理 4 个端点的登录、注销、注册和刷新。

当我调用注销端点并发送刷新令牌时,它会从数据库中删除刷新令牌,以便用户无法刷新访问令牌。 问题是我仍然可以使用访问令牌来调用应用程序的端点并获取授权,直到其定期到期。

我想知道是否有一种方法可以在注销后使访问令牌失效,而无需等待过期。

这是我在启动时的配置服务:

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "AuthenticationAndAuthorizationAPI", Version = "v1" });
            });
            services.AddIdentityCore<User>(o =>
            {
                o.User.RequireUniqueEmail = true;
                o.Password.RequireDigit = false;
                o.Password.RequireNonAlphanumeric = false;
                o.Password.RequireUppercase = false;
                o.Password.RequiredLength = 0;
            }).AddEntityFrameworkStores<AuthenticationDbContext>();

            AuthenticationConfiguration authenticationConfiguration = new();
            _configuration.Bind("Authentication", authenticationConfiguration);

            services.AddSingleton(authenticationConfiguration);

            services.AddEntityFrameworkNpgsql().AddDbContext<AuthenticationDbContext>(options =>
             options.UseNpgsql(_configuration.GetConnectionString("DBConnection")));

            services.AddSingleton<AccessTokenGenerator>();
            services.AddSingleton<RefreshTokenGenerator>();
            services.AddSingleton<RefreshTokenValidator>();
            services.AddScoped<Authenticator>();
            services.AddSingleton<TokenGenerator>();
            services.AddScoped<IRefreshTokenRepository, DatabaseRefreshTokenRepository>();

            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(o =>
            {
                o.TokenValidationParameters = new TokenValidationParameters()
                {
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authenticationConfiguration.AccessTokenSecret)),
                    ValidIssuer = authenticationConfiguration.Issuer,
                    ValidAudience = authenticationConfiguration.Audience,
                    ValidateIssuerSigningKey = true,
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ClockSkew = TimeSpan.Zero
                };
            });
        }

您不能“使”JWT 令牌“无效” - 您在这里有几个选项。

有一些解决方法,例如缩短令牌过期时间,以便缩短攻击窗口,或者在应用程序注销时删除客户端令牌,仍然可以解决“攻击者”提前窃取密钥的问题。

要强制真正的服务器端失效,您可以使用lastLogoutTs值,每次注销时都会更新。一旦用户注销,他们的lastLogoutTs数据库中的值发生更改,这意味着 JWT 令牌不再有效,并且无法验证访问权限。这显然意味着您在每次注销时都会访问数据库,但实际上并不像听起来那么糟糕,因为您可能会访问数据库来加载用户以将其注销。

或者,您可以保留一个,而不是额外的字段blocklist内存数据库中的表,允许您在 Redis、Memcached 等密钥上设置过期时间。该表将存储已注销、尚未达到令牌过期日期的用户的访问令牌。例如,在 Redis 中,您可以使用EXPIRE https://redis.io/commands/expire自动删除访问令牌,同时速度也非常快(因为它是内存数据库)。

对于不得使用数据库(想不出任何数据库)的解决方案,JWT 不合适,OAuth 2.0 之类的东西会更好(最终将注销逻辑卸载给 Google、Apple 等提供商)。

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

如何使 Identity Core 生成的访问令牌失效? 的相关文章

随机推荐

  • 在 Titanium 应用程序中找不到库 stlport_shared

    我想创建一个 Titanium 模块 因此我有一个扩展 KrollModule 及其方法的类 Kroll method public void example Activity activity this getActivity Strin
  • git 子模块的公共子模块

    我有一个申请main由多个子模块组成A B and utility functions 这两个子模块A and B本身包含子模块utility functions main A utility functions B utility fun
  • Tesseract-OCR 3.02 与 libc++

    Xcode 4 6 iOS SDK 6 1 tesseract ocr 3 02 由于最新的 OpenCV 版本是使用构建的libc 并且 tesseract ocr 是使用构建的libstdc 库 它们不能在一个 xcode 项目中一起使
  • 禁止用户订阅 Firebase 主题

    如何消除应用程序用户拨打电话的机会FirebaseMessaging subscribeToTopic String 为了仅在服务器端处理主题管理 Firebase 云消息传递主题是公开的 无法阻止特定用户订阅它们
  • ERRO[0043] 拨打 gRPC 失败:无法升级到 h2c,收到 501

    当我尝试使用以下命令构建 Dockerfile 时docker build t myimage1 今天我收到这个错误 ERRO 0043 failed to dial gRPC unable to upgrade to h2c receiv
  • 用lark语法识别多行部分

    我正在尝试编写一个简单的语法来解析具有多行部分的文本 我不知道该怎么做 这是我到目前为止写的语法 如果有任何帮助 我们将不胜感激 ps 我意识到 lark 对于这个问题来说太过分了 但这只是我试图解析的一个非常简化的版本 from unit
  • 调试多线程应用程序[重复]

    这个问题在这里已经有答案了 我有一个用 C 和 MFC 编写的应用程序 它在 Windows 上运行多线程 有时我确实会收到一些抱怨 例如由于这些线程而导致的死锁或未处理的异常 通常我使用 Visual Studio 如果问题可重现 或使用
  • 恢复 git merge 冲突标志

    我正在尝试找出一种与团队其他成员共享合并冲突的方法 我们有一些非常大的分支 合并它们会产生很多冲突 我尝试了几种不同的方法 我当前的尝试包括将处于冲突状态的文件推送到远程存储库 将合并标记留在文件中 然后运行一个烦人的长别名来 grep 通
  • SciPy Optimizer 给出不满足约束的结果

    我正在使用 scipy optimize minimize 来解决问题 但包给出的结果违反了约束 这种情况非常简单 只给出一个目标函数和一个约束 这是代码 import math import numpy as np import scip
  • 将所有 QLineEdits 设置为只读

    我试图将我的所有 QLineEdits 大约有 150 个 设置为只读 有没有办法在不单独检查和设置每个 QLineEdits 的情况下执行此操作 我希望我能做类似的事情QLineEdit setReadOnly true 在我的构造函数中
  • 用于查找无效电子邮件地址的 SQL 脚本

    数据导入是从 Access 数据库完成的 并且没有对电子邮件地址字段进行验证 有没有人有一个可以返回无效电子邮件地址列表 缺少 等 的sql脚本 SELECT FROM people WHERE email NOT LIKE 任何更复杂的事
  • Logstash 可以同时处理多个输出吗?

    我对 Logstash 和弹性搜索很陌生 我正在尝试将日志文件存储在elasticsearch 和平面文件中 我知道logstash 支持这两种输出 但它们是同时处理的吗 还是通过工作定期完成 是的 您可以通过使用托运人配置上的 add t
  • 为什么 Java 和 C# 中嵌套类的行为不同?

    我不明白为什么Java中出现以下代码错误 public abstract class TestClass private final int data protected TestClass int data this data data
  • 对于 read_csv 和数据值 NA 来说,这是正确的行为吗?

    我已经开了一个issue https github com pydata pandas issues 10647在 GitHub 以下行为对我来说似乎不正确 似乎如果默认为read csv is na values False那么包括 NA
  • 如何在 Javascript 中通过 标签分割字符串

    我有一个 data text 字符串 它返回如下值 span Name span Message Javascript 是否可以将这个值分成两个 以便我可以在两个不同的变量中获取 名称 和 消息 I tried var str data t
  • JVM进程大小和内存堆大小之间的巨大差异

    我正在 Windows 8 1 64 位 4GB RAM 上开发 java swing 应用程序JDK 版本 8u20 64 位 问题是当我启动应用程序时Netbeans 分析器带监视器选项 当第一个 Jframe 加载时 应用程序内存堆就
  • Neo4j 将数据存储在哪里?

    我是 Neo4j 的新手 正在 Ubuntu 上进行一些测试 我想知道 Neo4j 将数据存储在哪里 他们将创建的节点和关系存储在哪里 这应该有帮助 dpkg L neo4j config etc neo4j neo4j propertie
  • 分割空格避免双引号 JS 字符串:从 'a "b \\" c" d ' 到 ['a','"b \\" c"','d']

    我目前正在为自定义文件格式构建一个小型文本编辑器 我有一个 GUI 但我还实现了一个小型输出控制台 我想要实现的是添加一个非常基本的输入字段来执行一些命令并传递参数 命令如下所示 compile test json output bin l
  • python pandas根据其他列中的条件进行新列分类

    使用以下 python pandas dataframe df df pd DataFrame transaction id A123 A123 B345 B345 C567 C567 D678 D678 product id 255472
  • 如何使 Identity Core 生成的访问令牌失效?

    我在 Net5 应用程序上实现了 Identity Core 以处理 4 个端点的登录 注销 注册和刷新 当我调用注销端点并发送刷新令牌时 它会从数据库中删除刷新令牌 以便用户无法刷新访问令牌 问题是我仍然可以使用访问令牌来调用应用程序的端