如果在 Identity Server 4 中多次使用 OneTimeOnly 令牌,如何撤销刷新令牌

时间:2021-05-06 12:13:24

标签: .net identityserver4

我正在使用 Identity Server 4 + ASP.NET Core Identity 并且有一个设置,其中使用刷新令牌来请求应用程序的访问令牌。这些刷新令牌被配置为 OneTimeOnly 令牌。这意味着每次您使用刷新令牌检索新的访问令牌时,都应丢弃刷新令牌并收到一个新的刷新令牌。

Identity Server 的默认实现只是使用已使用的刷新令牌拒绝后续令牌请求。

但是,出于安全原因,多次使用刷新令牌可能意味着令牌已泄露。为此,我想撤销该用户的所有令牌,强制他/她重新登录。

documentation says 我需要 DefaultRefreshTokenService 类的 AcceptConsumedTokenAsync 虚拟方法的自定义实现。但我到底应该实施什么?

1 个答案:

答案 0 :(得分:0)

要删除给定用户的所有刷新令牌,确实需要覆盖 AcceptConsumedTokenAsync 虚拟方法。 DefaultRefreshTokenService 类有一个属性 RefreshTokenStore,可用于从数据库中删除所有令牌:

    public class RevokingDefaultRefreshTokenService : DefaultRefreshTokenService
    {
        public RevokingDefaultRefreshTokenService(
            IRefreshTokenStore refreshTokenStore,
            IProfileService profile,
            ISystemClock clock,
            ILogger<DefaultRefreshTokenService> logger)
            :
            base(refreshTokenStore, profile, clock, logger)
        {
        }

        protected override async Task<bool> AcceptConsumedTokenAsync(RefreshToken refreshToken)
        {
            // Revoke all refresh tokens for this user
            await RefreshTokenStore.RemoveRefreshTokensAsync(refreshToken.SubjectId, refreshToken.ClientId);

            // Base impl
            return await base.AcceptConsumedTokenAsync(refreshToken);
        }
    }

请注意,如果刷新令牌被泄露,只要他从该刷新令牌收到的访问令牌有效,恶意用户仍然可以访问您的系统。因此,请确保您的访问令牌具有合理的生命周期。