【问题标题】:Old Refresh Tokens are kept in [PersistedGrants] table after refresh刷新后旧的刷新令牌保留在 [PersistedGrants] 表中
【发布时间】:2019-03-16 05:12:18
【问题描述】:

我们正在使用 Identity Server 4 通过 ResourceOwnerPassword 流进行身份管理并发布访问和刷新令牌,并面临以下问题...

我们有短期访问令牌(15 分钟)和长期刷新令牌(15 天)。每次刷新刷新令牌后,我们都会发出新的访问和刷新令牌。最近我们遇到了一个问题(随着增长的增加),过去 15 天(到期时间)的所有刷新令牌都存储在 [PersistedGrants] 表中,即使在刷新此令牌并发出新的一个旧 ref 令牌后仍保留在此表。

我不知道这是我们想要的行为还是我们的实现中的一些错误,但是这个表中的数据量开始迅速增加,给我们带来了巨大的性能问题。

您可能会在下面找到查询此表的 IS4 内部查询:

SELECT TOP(@__p_0) 
    [x].[Key], [x].[ClientId], [x].[CreationTime], [x].[Data], 
    [x].[Expiration], [x].[SubjectId], [x].[Type]  
FROM 
    [PersistedGrants] AS [x]  
WHERE 
    [x].[Expiration] < GETUTCDATE()  ORDER BY [x].[Key]

SELECT COUNT(*) FROM PersistedGrants

INSERT INTO [PersistedGrants] ([Key], [ClientId], [CreationTime], [Data], [Expiration], [SubjectId], [Type])  
VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6)

也许有人遇到过同样的问题,或者这只是 IS4 的标准行为?

我们唯一可用的选择是将访问令牌的生命周期延长一小时并增加数据库大小?但是我不明白如果我们已经发行了新的,为什么 IS 需要这个旧的 ref 令牌。

(目前有些用户在这个表中有~10k ref tokens)

谢谢!

【问题讨论】:

  • 你应该确保 EnableTokenCleanup = true 在你的 OperationalStoreOptions 中。

标签: asp.net-core .net-core identityserver4


【解决方案1】:

这听起来很奇怪,因为如果您使用一次性刷新令牌,DefaultRefreshTokenService 在这种情况下会调用RefreshTokenStore.RemoveRefreshTokenAsync()

您确定您使用的是RefreshTokenUsage = TokenUsage.OneTimeOnly

【讨论】:

  • 嗨,麦琪,感谢您的回复。最初,我们没有在创建客户时指定RefreshTokenUsage (也许您知道这种情况下的默认行为是什么?)。但是当我尝试设置 RefreshTokenUsage = TokenUsage.ReUse 时,它仍然会在刷新时发出新的 ref 令牌。
  • Client 模型上属性的默认值为 OneTimeOnly,当您使用它时应该删除当前令牌。
猜你喜欢
  • 2021-11-14
  • 2021-03-16
  • 2021-08-20
  • 2021-06-19
  • 2017-10-12
  • 2010-11-04
  • 2011-06-29
  • 2017-04-14
  • 2016-01-05
相关资源
最近更新 更多