.NET 4.8升级至.NET 8后Angular应用防伪造令牌验证异常
.NET 4.8 升级到 .NET 8 防伪造验证异常解决方案
问题复盘
升级后触发如下异常:
Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException: 所需的防伪造标头值"temp"不存在。
在 Microsoft.AspNetCore.Antiforgery.DefaultAntiforgery.ValidateRequestAsync(HttpContext httpContext)
在 namespace.ValidateAntiforgeryTokenAuthorizationFilter.OnAuthorizationAsync(AuthorizationFilterContext context)
调试执行var tokens = Antiforgery.GetAndStoreTokens(httpContext)时,发现Cookie令牌为null,但请求令牌不为null,核心原因是.NET 8 对防伪造验证的逻辑、Cookie存储规则做了变更,与.NET Framework 4.8的实现不兼容。
可行解决方法
- 同步自定义防伪造配置:如果项目自定义了防伪造的标头名称(比如这里的"temp")或Cookie名称,需在.NET 8的
AddAntiforgery配置中统一设置,示例代码:builder.Services.AddAntiforgery(options => { options.HeaderName = "temp"; // 匹配自定义标头名称 options.Cookie.Name = ".AspNetCore.Antiforgery.YourCustomCookieName"; // 同步自定义Cookie名称 options.Cookie.SameSite = SameSiteMode.Lax; // 根据站点场景调整SameSite属性,避免Cookie被浏览器拦截 options.Cookie.Secure = true; // HTTPS站点需开启此配置 }); - 适配Cookie存储策略:.NET 8中防伪造Cookie的默认
SameSite、HttpOnly、Secure属性与旧版本不同,跨域场景需将SameSite设为None并配合Secure=true;非HTTPS环境则调整为SameSite=Lax。 - 检查自定义过滤器逻辑:确认
ValidateAntiforgeryTokenAuthorizationFilter中是否正确读取Cookie令牌,.NET 8的AntiforgeryAPI读取逻辑有变化,可直接通过httpContext.Request.Cookies读取对应名称的Cookie,再传入验证方法。 - 清除旧Cookie缓存:旧.NET Framework生成的防伪造Cookie与.NET 8不兼容,清除浏览器缓存和Cookie后重新生成令牌即可。
内容的提问来源于stack exchange,提问作者user173092
相关产品推荐
相关产品推荐

