web-dev-qa-db-ja.com

ビューステートMACのAsp.net検証に失敗しました

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.

ページが更新されても問題はありません。この問題を解決するにはどうすればよいですか?

29
Arbelac

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

23
mBotros

私にはこの問題があり、私にとっての答えは、この質問に対する他の答えとは異なっていました。

私は多くの顧客がいるアプリケーションを持っています。 global.asaxのapplication_errorですべてのエラーをキャッチし、エラーの詳細を記載したメールを自分に送信します。アプリの新しいバージョンを公開した後、ビューステートMACのエラーエラーメッセージの検証を多数受け取り始めました。

1日の検索の後、アプリにタイマーがあり、更新パネルが毎分更新されることに気付きました。そのため、新しいバージョンのアプリを公開し、一部の顧客が私のWebサイトでコンピューターを開いたままにしたとき。実際のビューステートが新しいビューステートと一致しないため、タイマーが更新されるたびにエラーメッセージが表示されます。すべての顧客がWebサイトを閉じるか、ブラウザを更新して新しいバージョンを取得するまで、このメッセージを受け取りました。

私の英語がすみません。私のケースが非常に具体的であることは知っていますが、誰かが1日節約するのに役立つなら、それは良いことだと思います。

16
Sébastien

マイクロソフトは キージェネレーターのWebサイトを使用しないでください と言います。

ここの他の全員と同様に、これをweb.configに追加しました。

<System.Web> <machineKey decryptionKey="ABC123...SUPERLONGKEY...5432JFEI242" validationKey="XYZ234...SUPERLONGVALIDATIONKEY...FDA" validation="SHA1" /> </system.web>

ただし、次のようにmachineKeyジェネレーターとしてIISを使用しました。

  1. IISを開き、この画面を表示するWebサイトを選択します。

enter image description here

  1. この画面を表示するには、マシンキーアイコンをダブルクリックします。

enter image description here

  1. 上の写真で説明した右側の[キーの生成]リンクをクリックします。

ノート:

  • 「アプリケーションごとに一意のキーを生成する」チェックボックスを選択すると、キーの末尾に「、IsolateApps」が追加されます。アプリを機能させるには、これらを削除する必要がありました。明らかに、それらはキーの一部ではありません。
  • SHA1はIISで選択されたデフォルトの暗号化方式でした。変更する場合は、web.configのmachineKeyの検証プロパティを変更することを忘れないでください。ただし、暗号化方式とアルゴリズムは進化しています。更新された優先暗号化方法を使用してこの投稿を編集するか、メモに記載してお気軽に更新してください。
14
Tony L.

このソリューションは、Webフォームサイトを使用してASP.NET 4.5で機能しました。

  1. 次のサイトを使用してマシンキーを生成します。 http://www.blackbeltcoder.com/Resources/MachineKey.aspx
  2. 完全なマシンキーコードをコピーします。
  3. Web.Configファイルに移動します。
  4. 次のコードセクションにマシンキーを貼り付けます。

    <configuration>

    <system.web>

    <machineKey ... />
    

    </system.web>

    </configuration>

Macのビューステートエラーが表示されなくなるはずです。同じアプリプール内の各Webサイトには個別のマシンキーが必要です。そうでない場合、このエラーは継続します。

8
TsTeaTime

マルチサーバー環境では、セッションの有効期限が切れ、アプリケーションの別のインスタンスが同じセッション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)
  }
}

次に:

ASP.NET 4.0の場合

Generate-MachineKey

キーは次のようになります:<machineKey decryption="AES" decryptionKey="..." validation="HMACSHA256" validationKey="..." />

ASP.NET 2.0および3.5の場合

Generate-MachineKey -validation sha1

キーは次のようになります:<machineKey decryption="AES" decryptionKey="..." validation="SHA1" validationKey="..." />

2
Zly-Zly

私の問題はこのjavascriptコードの一部でした

$('input').each(function(ele, indx){
    this.value = this.value.toUpperCase();
});

ビューステートの隠しフィールドを混乱させていたので、コードの下に変更しました

$('input:visible').each(function(ele, indx){
    this.value = this.value.toUpperCase();
});
1
irfandar

親愛なるすべての回答に敬意を表して、web.config値が

<httpCookies httpOnlyCookies="true" requireSSL="true"/>

リンクはhttpsではなくhttpです

1
Omar Kamel

私はこれと同じ問題を抱えていましたが、ソートが有効になっているページ上のGridview(vbコードから生成された)が原因でした。ソートを無効にすると問題が解決しました。 SQLdatasourceを使用して作成されたグリッドビューにはこの問題はありません。

0
aydin

このエラーメッセージは通常、Webサイトをサーバーに公開した後に表示されます。

主な問題は、Webサイトに使用するアプリケーションプールにあります。

Webサイトに関連するアプリケーションプールの[全般]セクションで、適切な.NET Frameworkバージョン(v4.0など)を使用するようにWebサイトを構成します。

プロセスモデルで、Identity値をNetwork Serviceに設定します。

ダイアログボックスを閉じ、Webサイトを右クリックして、コンテンツメニューの[Webサイトの管理]オプションから[詳細設定...]を選択します。ダイアログボックスの[全般]セクションで、使用するアプリケーションプールの適切な名前が選択されていることを確認します。

あなたのウェブサイトは問題なく実行されるはずです。

これがこのエラーの克服に役立つことを願っています。

0
Nanan

これがどのように発生したかはわかりませんが、内部送信フォームページでこのエラーが発生し始めました。そのため、何かを送信すると、このエラーが発生します。しかし問題は、この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="/" />
0
Salim
<system.web>
<pages validateRequest="false" enableEventValidation="false" viewStateEncryptionMode ="Never" />
</system.web>
0
Ya Kutty

私の顧客のために起こっていた別のシナリオがあります。これは、シフトの変更とユーザーが別のユーザーでログインする必要があるため、特定の時間に通常発生していました。このエラーを生成することにより、偽造防止システムがシステムを保護するシナリオを次に示します。

1-ブラウザを一度閉じてから開きます。 2-ウェブサイトにアクセスし、「ユーザーA」でログインします3-ブラウザで新しいタブを開き、同じアドレスサイトを入力します。 (認証なしでサイトのホームページを表示できます)4-サイトからログアウトし、2番目のタブで別のユーザー(ユーザーB)でログインします。 5-次に、「ユーザーA」によってログインした最初のタブに戻ります。このページは引き続き表示できますが、このタブでアクションを実行するとエラーが発生します。 Cookieは既に「ユーザーB」によって更新されており、無効なユーザーがリクエストを送信しようとしているためです。 (ユーザーA)

0
Tomcat0x4d2e47

WHAT DID WORK FOR ME

  1. 「MachineKeyジェネレーター」をWebで検索します

  2. 見つかったサイトの1つに移動して、マシンキーを生成します。これは次のようになります(数字が大きくなります)。
    ... MachineKey
    validationKey = "0EF6C03C11FC ... 63EAE6A00F0B6B35DD4B" decryptKey = "2F5E2FD80991C629 ... 3ACA674CD3B5F068" validation = "SHA1" encryption = "AES" />

  3. 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ジェネレーター」を検索し、オンラインサービスを使用できます。正直に...


http://www.blackbeltcoder.com/Resources/MachineKey.aspx

0
Ricardo Conte

ビューステートMACの検証に失敗しました。このアプリケーションがWebファームまたはクラスターによってホストされている場合、<machineKey>構成は、同じvalidationKeyと検証アルゴリズムを指定します。 AutoGenerateはクラスターでは使用できません。

回答:

<machineKey  decryptionKey="2CC8E5C3B1812451A707FBAAAEAC9052E05AE1B858993660" validation="HMACSHA256" decryption="AES" validationKey="CB8860CE588A62A2CF9B0B2F48D2C8C31A6A40F0517268CEBCA431A3177B08FC53D818B82DEDCF015A71A0C4B817EA8FDCA2B3BDD091D89F2EDDFB3C06C0CB32" />
0
Tavasul Ahmed