刷新后,旧的刷新令牌保留在[PersistedGrants]表中

时间:2018-10-11 07:32:24

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

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

我们有短暂的访问令牌(15分钟)和较长的刷新令牌(15天)。在刷新令牌的每次刷新之后,我们将发布新的访问和刷新令牌。最近,我们遇到了一个问题(增长速度加快了),即使刷新该令牌并发行了一个新的旧ref令牌,过去15天(过期时间)中的所有刷新令牌也都存储在[PersistedGrants]表中在此表中。

我不知道这是我们期望的行为还是我们实施中的某些错误,但是此表中的数据量开始迅速增加,并给我们带来了巨大的性能问题。

在下面,您可能会发现正在查询此表的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的标准行为?

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

(当前某些用户在此表中拥有约1万个引用令牌)

谢谢!

1 个答案:

答案 0 :(得分:0)

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

确定使用RefreshTokenUsage = TokenUsage.OneTimeOnly吗?