令牌自省结果缓存:如何在发起请求前读取并复用缓存
实现OpenIddict令牌自省的缓存复用机制
你已经实现了令牌自省完成后缓存ClaimsPrincipal的处理器,现在只需新增一个在自省请求发起前执行的处理器,读取缓存并跳过自省请求即可。
1. 新增缓存读取事件处理器
创建一个处理OpenIddictValidationEvents.HandleIntrospectionRequestContext的处理器,在令牌自省请求发送前检查缓存:
public class UseCachedIntrospectionResponseHandler(IMemoryCache memoryCache, ILogger<UseCachedIntrospectionResponseHandler> logger) : IOpenIddictValidationHandler<OpenIddictValidationEvents.HandleIntrospectionRequestContext> { public static OpenIddictValidationHandlerDescriptor Descriptor { get; } = OpenIddictValidationHandlerDescriptor.CreateBuilder<OpenIddictValidationEvents.HandleIntrospectionRequestContext>() .UseSingletonHandler<UseCachedIntrospectionResponseHandler>() // 设置在默认自省请求处理器之前执行,确保优先读取缓存 .SetOrder(OpenIddictValidationHandlers.Introspection.SendIntrospectionRequest.Descriptor.Order - 1000) .SetType(OpenIddictValidationHandlerType.Custom) .Build(); public ValueTask HandleAsync(OpenIddictValidationEvents.HandleIntrospectionRequestContext context) { if (context is null) { throw new ArgumentNullException(nameof(context)); } if (!string.IsNullOrEmpty(context.Request.Token) && memoryCache.TryGetValue(context.Request.Token, out ClaimsPrincipal? cachedPrincipal) && cachedPrincipal is not null) { // 直接复用缓存的ClaimsPrincipal,跳过自省请求 context.Principal = cachedPrincipal; context.HandleResponse(); logger.LogInformation("Reused cached introspection response for token '{Token}'.", context.Request.Token); } return default; } }
2. 注册两个缓存处理器
在OpenIddict验证服务配置中,添加这两个自定义处理器:
services.AddOpenIddict() .AddValidation(options => { // 其他配置... // 注册缓存读取和写入处理器 options.AddEventHandler<UseCachedIntrospectionResponseHandler.Descriptor>(); options.AddEventHandler<CacheIntrospectionResponseHandler.Descriptor>(); });
关键细节说明
- 执行顺序:读取处理器的
Order设置为默认发送请求处理器的Order - 1000,确保在发起自省请求前先检查缓存;写入处理器保持原有的顺序,在ClaimsPrincipal填充完成后缓存。 - 跳过请求:调用
context.HandleResponse()会终止后续的自省请求流程,直接使用缓存的ClaimsPrincipal完成验证。 - 缓存一致性:如果令牌被提前吊销,缓存的内容会在5分钟后过期,若需要实时吊销感知,可结合分布式缓存和主动失效机制(比如令牌吊销时删除对应缓存项)。
内容的提问来源于stack exchange,提问作者Dawid Bartniczak
相关产品推荐
相关产品推荐

