如果在 Identity Server 4 中多次使用 OneTimeOnly 令牌,如何撤销刷新令牌
How to revoke refresh tokens if a OneTimeOnly token is used multiple times in Identity Server 4
我正在使用 Identity Server 4 + ASP.NET Core Identity 并且有一个设置,其中刷新令牌用于请求应用程序的访问令牌。这些刷新令牌配置为 OneTimeOnly 令牌。这意味着每次您使用刷新令牌检索新的访问令牌时,刷新令牌都应该被丢弃,您会收到一个新的刷新令牌。
Identity Server 的默认实现只是拒绝使用已使用的刷新令牌的后续令牌请求。
但是,出于安全原因,多次使用刷新令牌可能意味着令牌已泄露。因此,我想撤销该用户的所有令牌,迫使 him/her 再次登录。
documentation says 我需要 DefaultRefreshTokenService
class' AcceptConsumedTokenAsync
虚拟方法的自定义实现。但我究竟应该实施什么?
要删除给定用户的所有刷新令牌,确实需要覆盖 AcceptConsumedTokenAsync
虚拟方法。 DefaultRefreshTokenService
class有一个属性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);
}
}
请注意,如果刷新令牌被泄露,恶意用户仍然可以访问您的系统,只要他从该刷新令牌收到的访问令牌有效。因此,请确保您的访问令牌具有合理的生命周期。
我正在使用 Identity Server 4 + ASP.NET Core Identity 并且有一个设置,其中刷新令牌用于请求应用程序的访问令牌。这些刷新令牌配置为 OneTimeOnly 令牌。这意味着每次您使用刷新令牌检索新的访问令牌时,刷新令牌都应该被丢弃,您会收到一个新的刷新令牌。
Identity Server 的默认实现只是拒绝使用已使用的刷新令牌的后续令牌请求。
但是,出于安全原因,多次使用刷新令牌可能意味着令牌已泄露。因此,我想撤销该用户的所有令牌,迫使 him/her 再次登录。
documentation says 我需要 DefaultRefreshTokenService
class' AcceptConsumedTokenAsync
虚拟方法的自定义实现。但我究竟应该实施什么?
要删除给定用户的所有刷新令牌,确实需要覆盖 AcceptConsumedTokenAsync
虚拟方法。 DefaultRefreshTokenService
class有一个属性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);
}
}
请注意,如果刷新令牌被泄露,恶意用户仍然可以访问您的系统,只要他从该刷新令牌收到的访问令牌有效。因此,请确保您的访问令牌具有合理的生命周期。