【发布时间】: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