我正在使用 Identity Server 4 + ASP.NET Core Identity 并且有一个设置,其中使用刷新令牌来请求应用程序的访问令牌。这些刷新令牌被配置为 OneTimeOnly 令牌。这意味着每次您使用刷新令牌检索新的访问令牌时,都应丢弃刷新令牌并收到一个新的刷新令牌。
Identity Server 的默认实现只是使用已使用的刷新令牌拒绝后续令牌请求。
但是,出于安全原因,多次使用刷新令牌可能意味着令牌已泄露。为此,我想撤销该用户的所有令牌,强制他/她重新登录。
documentation says 我需要 DefaultRefreshTokenService
类的 AcceptConsumedTokenAsync
虚拟方法的自定义实现。但我到底应该实施什么?
答案 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);
}
}
请注意,如果刷新令牌被泄露,只要他从该刷新令牌收到的访问令牌有效,恶意用户仍然可以访问您的系统。因此,请确保您的访问令牌具有合理的生命周期。