新增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重新加载共享密钥环。
2. 自动清除旧Antiforgery Cookie
添加前置中间件,在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
相关产品推荐
相关产品推荐

