AspNet.Security.OpenIdConnect.Server. Обновить токены

Насколько мне известно, ASOS "из коробки" поддерживает токены обновления. Чтобы получить токен обновления, мне нужно добавить область offline_access к моему запросу токена. Но где они хранятся? Как я могу изменить срок действия токена или удалить его? Как я могу определить, для какого пользователя создан токен обновления?


person Stalso    schedule 02.03.2016    source источник


Ответы (1)


Но где они хранятся?

По умолчанию они нигде не хранятся: они самодостаточны. Пока ключи шифрования, используемые для защиты токенов обновления, все еще находятся в кольце ключей защиты данных ASP.NET, они могут быть расшифрованы ASOS и использованы для выпуска новых токенов доступа.


Как я могу изменить срок действия токена?

Срок действия по умолчанию может быть установлен глобально из опций с помощью свойства RefreshTokenLifetime. Если вы не укажете свой срок жизни, они действительны в течение 14 дней.

Обратите внимание, что скользящее истечение срока действия также включено по умолчанию, что означает, что вы получаете новый токен обновления (действительный в течение 14 дней) каждый раз, когда делаете новый grant_type=refresh_token запрос. Вы можете отключить скользящее истечение срока, установив UseSlidingExpiration на false.


... или удалить?

Поскольку токены обновления являются самодостаточными, вы не можете их удалить. Вы, конечно, можете рассмотреть возможность использования пользовательских токенов (например, уникальных строк, соответствующих записи в базе данных), переопределив события SerializeRefreshToken и DeserializeRefreshToken, но рекомендуемый подход состоит в том, чтобы просто рассматривать их как недействительные при получении запроса токена обновления.

Для этого вы можете переопределить событие HandleTokenRequest и вызвать context.Reject(), если считаете, что refresh_token было отозвано и не может использоваться для выпуска новых токенов.


Как я могу определить, для какого пользователя создан токен обновления?

Маркеры обновления содержат все утверждения, которые вы добавляете при создании исходного билета аутентификации, поэтому, если вы добавите утверждение sub, соответствующее идентификатору пользователя, вы можете использовать его для получения профиля пользователя из базы данных.

person Kévin Chalet    schedule 02.03.2016
comment
Спасибо. но у нас есть одно недоразумение по поводу истечения срока действия токена. Как я могу изменить срок годности одного конкретного, уже сгенерированного токена? Или я должен аннулировать его, используя метод GrantRefreshTokenGrant , и я буду очень рад, если вы покажете мне, как я могу забанить пользователя. Что такое manager.SupportsUserSecurityStamp ? Как я могу это использовать? На самом деле мне нужно дать пользователям токены и немедленно аннулировать токены (немедленно заблокировать пользователей). - person Stalso; 02.03.2016
comment
Вы не можете изменить дату истечения срока действия токена обновления, который уже был выпущен (он жестко запрограммирован внутри токена), но, как вы поняли, вы можете использовать GrantRefreshTokenGrant, чтобы добавить свою собственную логику, чтобы определить, действителен ли токен обновления. Вы можете позвонить context.Rejected(), чтобы отклонить запрос на обновление токена, если пользователь заблокирован. - person Kévin Chalet; 02.03.2016
comment
Насколько я понимаю, мне нужно добавить поле Banned в мою пользовательскую модель и проверить его в GrantRefreshTokenGrant , а затем отклонить токен? Если я воспользуюсь таким подходом, я не смогу сразу заблокировать пользователя или добавить новые претензии. Есть ли способ проверять токены доступа для каждого запроса? Может в AuthorizationEndpoint это сделать? - person Stalso; 02.03.2016
comment
Да, это идея (и рекомендуемый подход). Если вам нужно поддерживать такую ​​функцию с помощью токенов доступа (а не токенов обновления), вам нужно будет сделать это на уровне промежуточного программного обеспечения носителя JWT (app.UseJwtBearerAuthentication()), поскольку это место, где токены доступа проверяются стеком. - person Kévin Chalet; 02.03.2016
comment
Извините, но я не могу понять, как это сделать в app.UseJwtBearerAuthentication(). Вы можете посоветовать, где это делать? - person Stalso; 02.03.2016
comment
В идеале это следует задать в другом вопросе, но вот подсказка: вы можете использовать событие ValidatedToken, чтобы добавить свою собственную процедуру проверки: github.com/aspnet/Security/blob/1.0.0-rc1/src/ . В качестве альтернативы вы также можете добавить проверку блокировки непосредственно на уровне авторизации в настраиваемой политике авторизации. - person Kévin Chalet; 02.03.2016
comment
Спасибо. Это было очень полезно - person Stalso; 02.03.2016
comment
Вы сказали, что токен обновления является самодостаточным. Я размещаю проект через IIS и использую носитель JWT вместе с ASOS. Интересно, почему токен обновления недействителен после перезапуска IIS, если он самодостаточен? На данный момент мне нужен автономный, поэтому он должен быть действителен даже после перезагрузки сервера. Следует ли мне задать другой вопрос? - person Mohammad Nikravan; 27.11.2017
comment
Ссылка на OpenIdict сейчас не существует (404). Не могли бы вы обновить ссылку, чтобы мы это увидели? Жизненно важно, чтобы мы могли отзывать токены обновления по очевидным причинам. - person James Hancock; 25.06.2018
comment
@JamesHancock Я удалил эту часть, поскольку соответствующий код больше не существует в OpenIddict. Дайте - person Kévin Chalet; 25.06.2018