Старые токены обновления сохраняются в таблице [PersistedGrants] после обновления. - PullRequest
0 голосов
/ 11 октября 2018

Мы используем Identity Server 4 для управления идентификацией с потоком ResourceOwnerPassword и выдачи маркеров доступа и обновления, и столкнулись со следующей проблемой ...

У нас есть краткосрочные токены доступа (15 минут) и долгоживущее обновлениежетоны (15 дней).После каждого обновления токена обновления мы выдаем новый токен доступа и обновления.Недавно мы столкнулись с проблемой (с повышенным ростом), что все токены обновления за последние 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?

А единственной доступной для нас опцией будет увеличение времени жизни токена доступа на час и увеличение размера БД?Но тогда я не понимаю, зачем IS нужны эти старые жетоны ссылок, если мы уже выпустили новые.

(в настоящее время некоторые пользователи имеют ~ 10k жетонов ссылок в этой таблице)

Спасибо!

1 Ответ

0 голосов
/ 11 октября 2018

Звучит странно, поскольку DefaultRefreshTokenService вызовет RefreshTokenStore.RemoveRefreshTokenAsync() в этом сценарии, если вы используете одноразовые токены обновления.

Вы уверены, что используете RefreshTokenUsage = TokenUsage.OneTimeOnly?

...