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

新增Web服务器后仍出现DefaultAntiforgery令牌解密错误求助

问题原因分析

你遇到的持续报错核心原因如下:

  • 新增服务器在权限缺失期间,因无法访问DFS共享密钥存储,ASP.NET Core Data Protection会自动回退到本地密钥存储(默认路径%LOCALAPPDATA%\ASP.NET\DataProtection-Keys),这些服务器用本地密钥生成了Antiforgery令牌并写入用户浏览器Cookie。
  • 即便修改了Antiforgery的Cookie/字段名称,DefaultAntiforgery中间件的GetCookieTokenDoesNotThrow方法仍会扫描所有符合Antiforgery格式的Cookie(默认前缀.AspNetCore.Antiforgery),尝试反序列化旧Cookie中的无效令牌,失败后就会记录你看到的异常。
解决方案

1. 验证Data Protection共享密钥配置生效

先确保所有服务器已正确切换到DFS共享密钥存储:

  • 检查新增服务器的本地%LOCALAPPDATA%\ASP.NET\DataProtection-Keys目录,确认权限修复后没有再生成新的本地密钥(若有则说明配置未生效,需排查DFS路径权限、目录是否存在、代码中路径是否正确)。
  • 重启所有服务器的应用池/站点,强制Data Protection重新加载共享密钥环。

添加前置中间件,在Antiforgery处理前删除用户请求中的旧Cookie,避免中间件尝试解析:

// 放在UseAntiforgery()中间件之前
app.Use(async (context, next) =>
{
    // 匹配旧Antiforgery Cookie的前缀或具体名称
    var oldAntiforgeryCookieKeys = context.Request.Cookies.Keys
        .Where(key => key.StartsWith(".AspNetCore.Antiforgery"));
    
    foreach (var cookieKey in oldAntiforgeryCookieKeys)
    {
        context.Response.Cookies.Delete(cookieKey, new CookieOptions
        {
            Domain = context.Request.Host.Host,
            Path = "/",
            Secure = context.Request.IsHttps,
            HttpOnly = true
        });
    }
    
    await next();
});

3. 过滤异常日志(临时方案)

若无法立即清除旧Cookie,可通过日志配置过滤该类异常:
在appsettings.json中添加日志级别过滤:

{
  "Logging": {
    "LogLevel": {
      "Microsoft.AspNetCore.Antiforgery.DefaultAntiforgery": "None"
    }
  }
}

4. 确保Antiforgery配置完全隔离新旧令牌

  • 新Cookie名称避免和旧名称有重叠前缀
  • 可选:设置options.Cookie.SameSite、Secure等属性,确保新Cookie的上下文和旧Cookie完全区分

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:43:22