Asp.net Webサイトで特定の時間に次のエラーが表示されます。
Sys.WebForms.PageRequestManagerServerErrorException:
Validation of viewstate MAC failed.
If this application is hosted by a Web Farm or cluster,
ensure that <machineKey> configuration specifies the
same validationKey and validation algorithm.
AutoGenerate cannot be used in a cluster.
ページが更新されても問題はありません。この問題を解決するにはどうすればよいですか?
Webファームを使用しており、複数のコンピューターで同じアプリケーションを実行している場合、machine.configファイルでマシンキーを明示的に定義する必要があります。
<machineKey validationKey="JFDSGOIEURTJKTREKOIRUWTKLRJTKUROIUFLKSIOSUGOIFDS..." decryptionKey="KAJDFOIAUOILKER534095U43098435H43OI5098479854" validation="SHA1" />
<system.web>
タグの下に配置します。
マシンコードのAutoGenerateは使用できません。独自のmachineKeyを生成するには、このPowerShellスクリプトを参照してください: https://support.Microsoft.com/en-us/kb/2915218#bookmark-appendixa
私にはこの問題があり、私にとっての答えは、この質問に対する他の答えとは異なっていました。
私は多くの顧客がいるアプリケーションを持っています。 global.asax
のapplication_errorですべてのエラーをキャッチし、エラーの詳細を記載したメールを自分に送信します。アプリの新しいバージョンを公開した後、ビューステートMACのエラーエラーメッセージの検証を多数受け取り始めました。
1日の検索の後、アプリにタイマーがあり、更新パネルが毎分更新されることに気付きました。そのため、新しいバージョンのアプリを公開し、一部の顧客が私のWebサイトでコンピューターを開いたままにしたとき。実際のビューステートが新しいビューステートと一致しないため、タイマーが更新されるたびにエラーメッセージが表示されます。すべての顧客がWebサイトを閉じるか、ブラウザを更新して新しいバージョンを取得するまで、このメッセージを受け取りました。
私の英語がすみません。私のケースが非常に具体的であることは知っていますが、誰かが1日節約するのに役立つなら、それは良いことだと思います。
マイクロソフトは キージェネレーターのWebサイトを使用しないでください と言います。
ここの他の全員と同様に、これをweb.configに追加しました。
<System.Web> <machineKey decryptionKey="ABC123...SUPERLONGKEY...5432JFEI242" validationKey="XYZ234...SUPERLONGVALIDATIONKEY...FDA" validation="SHA1" /> </system.web>
ただし、次のようにmachineKeyジェネレーターとしてIISを使用しました。
ノート:
このソリューションは、Webフォームサイトを使用してASP.NET 4.5で機能しました。
次のコードセクションにマシンキーを貼り付けます。
<configuration
>
<system.web
>
<machineKey ... />
</system.web
>
</configuration
>
Macのビューステートエラーが表示されなくなるはずです。同じアプリプール内の各Webサイトには個別のマシンキーが必要です。そうでない場合、このエラーは継続します。
マルチサーバー環境では、セッションの有効期限が切れ、アプリケーションの別のインスタンスが同じセッションIDとマシンキーで別のサーバー上で再利用されると、このエラーが発生する可能性があります。最初に、各サーバーは独自のマシンキーを生成します。このマシンキーは、後でアプリケーションの単一インスタンスに関連付けられます。セッションが期限切れになり、現在のサーバーがビジーになると、アプリケーションは、ロードバランサーを介して、より運用可能なサーバーにリダイレクトされます。私の場合、複数のサーバーから同じアプリを実行すると、エラーメッセージが表示されます。
ビューステートMACの検証に失敗しました。このアプリケーションがWebファームまたはクラスターによってホストされている場合、構成が同じvalidationKeyと検証アルゴリズムを指定していることを確認してください
Web.configでマシンコードを定義することで問題が解決しました。ただし、破損している可能性のあるコード生成にサードパーティのサイトを使用する代わりに、コマンドシェルからこれを実行してください:Microsoftソリューション1aに基づいて、 https://support.Microsoft.com/en-us/kb/2915218 #AppendixA
# Generates a <machineKey> element that can be copied + pasted into a Web.config file.
function Generate-MachineKey {
[CmdletBinding()]
param (
[ValidateSet("AES", "DES", "3DES")]
[string]$decryptionAlgorithm = 'AES',
[ValidateSet("MD5", "SHA1", "HMACSHA256", "HMACSHA384", "HMACSHA512")]
[string]$validationAlgorithm = 'HMACSHA256'
)
process {
function BinaryToHex {
[CmdLetBinding()]
param($bytes)
process {
$builder = new-object System.Text.StringBuilder
foreach ($b in $bytes) {
$builder = $builder.AppendFormat([System.Globalization.CultureInfo]::InvariantCulture, "{0:X2}", $b)
}
$builder
}
}
switch ($decryptionAlgorithm) {
"AES" { $decryptionObject = new-object System.Security.Cryptography.AesCryptoServiceProvider }
"DES" { $decryptionObject = new-object System.Security.Cryptography.DESCryptoServiceProvider }
"3DES" { $decryptionObject = new-object System.Security.Cryptography.TripleDESCryptoServiceProvider }
}
$decryptionObject.GenerateKey()
$decryptionKey = BinaryToHex($decryptionObject.Key)
$decryptionObject.Dispose()
switch ($validationAlgorithm) {
"MD5" { $validationObject = new-object System.Security.Cryptography.HMACMD5 }
"SHA1" { $validationObject = new-object System.Security.Cryptography.HMACSHA1 }
"HMACSHA256" { $validationObject = new-object System.Security.Cryptography.HMACSHA256 }
"HMACSHA385" { $validationObject = new-object System.Security.Cryptography.HMACSHA384 }
"HMACSHA512" { $validationObject = new-object System.Security.Cryptography.HMACSHA512 }
}
$validationKey = BinaryToHex($validationObject.Key)
$validationObject.Dispose()
[string]::Format([System.Globalization.CultureInfo]::InvariantCulture,
"<machineKey decryption=`"{0}`" decryptionKey=`"{1}`" validation=`"{2}`" validationKey=`"{3}`" />",
$decryptionAlgorithm.ToUpperInvariant(), $decryptionKey,
$validationAlgorithm.ToUpperInvariant(), $validationKey)
}
}
次に:
Generate-MachineKey
キーは次のようになります:<machineKey decryption="AES" decryptionKey="..." validation="HMACSHA256" validationKey="..." />
Generate-MachineKey -validation sha1
キーは次のようになります:<machineKey decryption="AES" decryptionKey="..." validation="SHA1" validationKey="..." />
私の問題はこのjavascriptコードの一部でした
$('input').each(function(ele, indx){
this.value = this.value.toUpperCase();
});
ビューステートの隠しフィールドを混乱させていたので、コードの下に変更しました
$('input:visible').each(function(ele, indx){
this.value = this.value.toUpperCase();
});
親愛なるすべての回答に敬意を表して、web.config値が
<httpCookies httpOnlyCookies="true" requireSSL="true"/>
リンクはhttpsではなくhttpです
私はこれと同じ問題を抱えていましたが、ソートが有効になっているページ上のGridview(vbコードから生成された)が原因でした。ソートを無効にすると問題が解決しました。 SQLdatasourceを使用して作成されたグリッドビューにはこの問題はありません。
このエラーメッセージは通常、Webサイトをサーバーに公開した後に表示されます。
主な問題は、Webサイトに使用するアプリケーションプールにあります。
Webサイトに関連するアプリケーションプールの[全般]セクションで、適切な.NET Frameworkバージョン(v4.0など)を使用するようにWebサイトを構成します。
プロセスモデルで、Identity値をNetwork Serviceに設定します。
ダイアログボックスを閉じ、Webサイトを右クリックして、コンテンツメニューの[Webサイトの管理]オプションから[詳細設定...]を選択します。ダイアログボックスの[全般]セクションで、使用するアプリケーションプールの適切な名前が選択されていることを確認します。
あなたのウェブサイトは問題なく実行されるはずです。
これがこのエラーの克服に役立つことを願っています。
これがどのように発生したかはわかりませんが、内部送信フォームページでこのエラーが発生し始めました。そのため、何かを送信すると、このエラーが発生します。しかし問題は、このWebサイトがほぼ5〜6年稼働していることです。重要な変更を行ったことを覚えていません。
どのソリューションも私にとってはうまくいきませんでした。
Microsoftスクリプトでマシンキーをセットアップし、web.configにコピーしました
Asp.net regiisスクリプトを実行しました。
aspnet_regiis -ga "IIS APPPOOL\My App Pool"
また、このコードをページに追加しようとしました:
enableViewStateMac="false"
まだ運がありません。
この問題を解決する他のアイデアはありますか?
更新:
最後に、問題を解決しました。 angular 4コンポーネントをasp.net Webサイトに統合しました。そのため、マスターページにbase hrefを追加しました。そのコードを削除し、現在は正常に動作しています。
<base href="/" />
<system.web>
<pages validateRequest="false" enableEventValidation="false" viewStateEncryptionMode ="Never" />
</system.web>
私の顧客のために起こっていた別のシナリオがあります。これは、シフトの変更とユーザーが別のユーザーでログインする必要があるため、特定の時間に通常発生していました。このエラーを生成することにより、偽造防止システムがシステムを保護するシナリオを次に示します。
1-ブラウザを一度閉じてから開きます。 2-ウェブサイトにアクセスし、「ユーザーA」でログインします3-ブラウザで新しいタブを開き、同じアドレスサイトを入力します。 (認証なしでサイトのホームページを表示できます)4-サイトからログアウトし、2番目のタブで別のユーザー(ユーザーB)でログインします。 5-次に、「ユーザーA」によってログインした最初のタブに戻ります。このページは引き続き表示できますが、このタブでアクションを実行するとエラーが発生します。 Cookieは既に「ユーザーB」によって更新されており、無効なユーザーがリクエストを送信しようとしているためです。 (ユーザーA)
WHAT DID WORK FOR ME
「MachineKeyジェネレーター」をWebで検索します
見つかったサイトの1つに移動して、マシンキーを生成します。これは次のようになります(数字が大きくなります)。
... MachineKey
validationKey = "0EF6C03C11FC ... 63EAE6A00F0B6B35DD4B" decryptKey = "2F5E2FD80991C629 ... 3ACA674CD3B5F068" validation = "SHA1" encryption = "AES" />
Web.configファイルの<system.web>
セクションにコピーして貼り付けます。
あなたが私がした道を辿りたいなら...
https://support.Microsoft.com/en-us/kb/2915218#AppendixA
ビューステートメッセージ認証コード(MAC)エラーの解決解決策3b:明示的な<machineKey>
を使用する
明示的な<machineKey>
要素をアプリケーションのWeb.configファイルに追加することにより、開発者は自動生成された暗号化キーを使用しないようにASP.NETに指示します。 <machineKey>
要素を生成する方法については、付録Aを参照してください。
http://blogs.msdn.com/b/amb/archive/2012/07/31/easiest-way-to-generate-machinekey.aspx
MachineKeyを生成する最も簡単な方法-Ahmet Mithat Bostanci-31 Jul 2012 Bingで「MachineKeyジェネレーター」を検索し、オンラインサービスを使用できます。正直に...
ビューステートMACの検証に失敗しました。このアプリケーションがWebファームまたはクラスターによってホストされている場合、<machineKey>
構成は、同じvalidationKeyと検証アルゴリズムを指定します。 AutoGenerateはクラスターでは使用できません。
回答:
<machineKey decryptionKey="2CC8E5C3B1812451A707FBAAAEAC9052E05AE1B858993660" validation="HMACSHA256" decryption="AES" validationKey="CB8860CE588A62A2CF9B0B2F48D2C8C31A6A40F0517268CEBCA431A3177B08FC53D818B82DEDCF015A71A0C4B817EA8FDCA2B3BDD091D89F2EDDFB3C06C0CB32" />