You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

令牌自省结果缓存:如何在发起请求前读取并复用缓存

实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 08:30:16