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

Blazor Web应用中MemoryCache TryGetValue始终返回false问题排查

问题根源
  1. MemoryCache的生命周期限制:MemoryCache是内存级缓存,仅存活于当前应用进程(服务器端)或浏览器会话(客户端WebAssembly)的内存中,页面刷新、应用重启后数据会直接丢失。你在登录时存入的token只存在于当前会话内存,应用启动进入ResolveAuthorization页面时,MemoryCache已被重置,自然读不到值。
  2. 预渲染上下文隔离(针对Blazor Server/Auto模式):如果应用启用了预渲染,ResolveAuthorization页面会在服务器端无状态预渲染阶段执行,此时用户未建立有效会话,预渲染进程无法访问到用户会话中的缓存数据,导致读取失败。
修复方案

方案1:客户端持久化Token(WebAssembly/Auto交互模式)

将token存入LocalStorage替代MemoryCache,实现跨页面刷新的持久化:

  1. 安装Microsoft.AspNetCore.Components.WebAssembly.Storage包(WebAssembly场景)。
  2. 在Program.cs注册LocalStorage服务:
    builder.Services.AddScoped<ILocalStorageService, LocalStorageService>();
    
  3. 修改AuthorizationService,同时写入LocalStorage和MemoryCache:
    public async Task Login(string token)
    {
        await _localStorage.SetItemAsync("auth_token", token);
        _memoryCache.Set("auth_token", token);
    }
    
  4. 在ResolveAuthorization页面读取token:
    protected override async Task OnInitializedAsync()
    {
        var token = await _localStorage.GetItemAsync<string>("auth_token");
        if (!string.IsNullOrEmpty(token))
        {
            // 执行token验证与自动登录逻辑
            await _authorizationService.SetAuthenticatedUser(token);
        }
    }
    

方案2:服务器端Cookie存储Token(Blazor Server/Auto服务器模式)

用HttpOnly Cookie存储token,兼顾安全性与会话持久化:

  1. 登录成功后写入Cookie:
    public async Task Login(string token)
    {
        var cookieOptions = new CookieOptions
        {
            HttpOnly = true,
            Secure = true, // 生产环境启用
            SameSite = SameSiteMode.Strict,
            Expires = DateTimeOffset.UtcNow.AddDays(7)
        };
        _httpContextAccessor.HttpContext.Response.Cookies.Append("auth_token", token, cookieOptions);
        _memoryCache.Set("auth_token", token);
    }
    
  2. 在ResolveAuthorization页面读取Cookie:
    protected override void OnInitialized()
    {
        var token = _httpContextAccessor.HttpContext.Request.Cookies["auth_token"];
        if (!string.IsNullOrEmpty(token))
        {
            _authorizationService.SetAuthenticatedUser(token);
        }
    }
    
  3. 在Program.cs注册HttpContextAccessor:
    builder.Services.AddHttpContextAccessor();
    

方案3:关闭预渲染(解决上下文隔离问题)

如果问题由预渲染导致,可禁用预渲染:
修改App.razor中的渲染模式:

<Routes @rendermode="@(new InteractiveAutoRenderMode(prerender: false))" />

此方案仅解决预渲染上下文问题,需结合持久化存储方案彻底解决token丢失问题。

额外注意事项
  • 自动登录前必须验证token的有效性(过期时间、签名等),避免使用无效token。
  • 敏感token优先使用HttpOnly Cookie(服务器端)或加密后的LocalStorage(客户端)存储,降低安全风险。

内容的提问来源于stack exchange,提问作者Danny Verdel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 20:43:37