新会话的第一个表单提交的视图状态验证失败

Viewstate verification failed for the first form submit of new sessions

我们在 ASP.NET 4.5.2 上有一个网站 运行,它在新会话的第一个表单提交时抛出以下视图状态错误,特别是当该表单提交是第一个回发时在网站上。任何后续的表单提交似乎都没有问题,直到您关闭浏览器并开始新的会话。如果您先在网站的其他地方导航然后转到表单,也不会发生这种情况;仅当您从一开始就直接转到表单(即直接导航到登录页面)时才会这样做。

Event code: 4009 
Event message: Viewstate verification failed. Reason: The viewstate supplied failed integrity check. 
Is authenticated: False 
Authentication Type: Forms 
Thread account name: IIS APPPOOL\.NET v4.5 
Exception message: Invalid viewstate.

这在 Edge 和 Chrome 中是 reported/demonstrated,但不是 Firefox 或 Internet Explorer。

编辑:原来我们能够识别出 Edge 和 Chrome 在初始浏览网站时没有 ASP.NET_SessionID 会话 cookie。回发后,会话 ID 出现在 cookie 中,表单再次工作。这在 Firefox 中不会发生,Firefox 具有来自第一个页面加载的 .NET 会话 ID。此会话 ID 用作 ViewStateUserKey,这可能解释了错误的原因,但不是原因。为什么 Chrome 在回发之前没有会话 ID?

我已经阅读了互联网上关于此错误的所有内容,所以让我根据我看到的其他建议记下一些事项:

其他相关信息:

如有任何想法,我们将不胜感激!

编辑:有人询问表单是如何提交的。这是我可以在 giftcard.aspx.

上重现错误的表单页面之一的表单代码示例
<form name="aspnetForm" method="post" action="./giftcard.aspx" onsubmit="javascript:return WebForm_OnSubmit();" id="aspnetForm">
<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/[gibberish]" />
</div>
<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['aspnetForm'];
if (!theForm) {
    theForm = document.aspnetForm;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>
<script src="/WebResource.axd?[gibberish]" type="text/javascript"></script>
<script src="jscripts/formvalidate.js" type="text/javascript"></script>
<script src="jscripts/core.js" type="text/javascript"></script>
<script src="/ScriptResource.axd?[gibberish]" type="text/javascript"></script>
<script src="/ScriptResource.axd?[gibberish]" type="text/javascript"></script>
<script src="/ScriptResource.axd?[gibberish]" type="text/javascript"></script>
<script src="/WebResource.axd?[gibberish]" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
function WebForm_OnSubmit() {
if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) return false;
return true;
}
//]]>
</script>

我们正在使用 asp:Button 控件进行提交,如下所示:

<asp:Button ID="btnContinue" CssClass="btn-primary btn-GCcontinue" runat="server" Text="Continue" OnClick="btnContinue_Click" />

此示例是网站上的典型表单。

原来答案与 Samesite cookie 有关。我们最近更新了我们的会话 ID cookie 以使用 samesite=none 试图解决我们怀疑与 Chrome 的 samesite 更改相关的付款处理问题。当我们这样做时,我们没有意识到我们也需要指定 Secure,虽然我仍然不确定缺少 Secure 如何导致我们观察到的特定行为,更新我们的会话 cookie 以使用 SameSite=None; Secure; 似乎已经修复了它,Chrome 现在从第一个请求中识别出 ASP.NET_SessionId。

旁注,因为我们的 .NET 版本太旧,我们在此处找到的应用程序配置中使用重写 https://www.coderfrontline.com/chromes-samesite-cookie-changes-are-breaking-apps/ 现在我再次查看它完全说要使用 Secure 但是当时我们没有注意到,只是逐字复制样本。因此,如果您使用的是 HTTPS,请确保添加 Secure。