表单无重复密钥仍出现AntiForgeryToken无法解密错误如何解决?
排查步骤
- 首先修正Cookie名称硬编码问题
你的代码中硬写死了Cookie名称__RequestVerificationToken_L21vYmlsZQ2,该名称的后缀是站点部署路径的Base64编码值,不同环境、不同部署路径下该名称会自动变化,硬编码会导致你取不到正确的Cookie Token。请替换为框架提供的常量:.Select(c => c[AntiForgeryConfig.CookieName]) - 修正前端Token取值逻辑
@Html.AntiForgeryToken()会同时生成两个配对校验的Token:一个是存在Cookie里的加密Token,另一个是渲染到页面隐藏input(name为__RequestVerificationToken)里的表单Token,二者本身就不是相同值,你观察到的两个值不一致属于正常现象。校验失败是因为二者配对关系不匹配,确认你前端请求头X-XSRF-Token取的是页面隐藏input里的value值,而不是Cookie里的Token值。 - 检查Cookie作用域匹配性
如果你的站点部署在二级路径下(如https://域名/mobile/),确认接口请求的路径和站点路径在同一级,Cookie的Path属性和请求路径匹配,避免请求时带了其他路径下生成的旧AntiForgery Cookie。 - 确认MachineKey配置生效
检查web.config中<machineKey>节点是否放在<system.web>根节点下,且未被IIS站点级别的「自动生成MachineKey」配置覆盖:IIS站点功能视图→Machine Key→取消勾选「在运行时自动生成」「为每个应用程序生成一个唯一的密钥」两个选项,确保你配置的显式密钥生效。 - 排查Token覆盖问题
抓包确认页面加载完成后,是否有其他异步请求返回了新的AntiForgery Cookie覆盖了初始Cookie,导致后续请求携带的Cookie Token和页面初始化时取到的请求头Token配对失效。 - 校验运行环境版本一致性
确认所有部署节点的.NET Framework版本完全一致,不同版本的AntiForgeryToken加密逻辑存在差异,即使密钥一致也会出现解密失败问题。
内容的提问来源于stack exchange,提问作者ANEES
相关产品推荐
相关产品推荐

