ASP.NET 4.5.2で実行されているWebサイトがあり、新しいセッションの最初のフォーム送信時に、特にそのフォーム送信がサイトでの最初のポストバックである場合にのみ、以下のビューステートエラーがスローされます。ブラウザを閉じて新しいセッションを開始するまで、その後のフォーム送信は問題ないようです。また、最初にサイトの他の場所に移動してからフォームに移動した場合も発生しません。最初からフォームに直接移動する(つまり、サインインページに直接移動する)場合のみです。
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で報告/実証されていますが、FirefoxやInternetExplorerでは報告されていません。
編集:サイトの最初の閲覧時に、EdgeとChromeにASP.NET_SessionIDセッションCookieがないことを特定できたことがわかりました。ポストバック後、セッションIDがCookieに表示され、フォームが再び機能します。これはFirefoxでは発生しません。Firefoxには最初のページの読み込みからの.NETセッションIDがあります。このセッションIDはViewStateUserKeyとして使用されており、これはおそらくエラーの方法を説明していますが、理由は説明していません。ポストバックが完了するまでChromeにセッションIDがないのはなぜですか?
私はすでにこのエラーで見つけることができるインターネット上のすべてを読んだので、私が見た他の提案に基づいていくつかのことに注意しましょう:
関連する場合のその他の情報:
<authentication mode="Forms"><forms name="XXXXXXXXXX" loginUrl="SignIn.aspx" timeout="525600" /></authentication>
<sessionState mode="InProc" cookieless="false" timeout="20" />
どんなアイデアでも大歓迎です!
編集:誰かがフォームがどのように提出されるかについて尋ねました。これは、giftcard.aspxでエラーを再現できるフォームページの1つからのフォームコードのサンプルです。
<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" />
この例は、サイトの典型的なフォームです。
答えはSamesiteCookieに関連していることが判明しました。最近、Chromeの同じサイトの変更に関連していると思われる支払い処理の問題を修正するために、samesite = noneを使用するようにセッションIDCookieを更新しました。それを行ったとき、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を追加してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加