web-dev-qa-db-ja.com

WebResource.axdの「パディングが無効で削除できない」例外

ローカル環境で正常に動作するASP.NET 2.0アプリケーションがあります。テストサーバーに公開すると、サーバーで断続的なエラーが発生します。

最も一般的なのは次のとおりです。

パディングは無効であり、削除できません。説明:現在のWebリクエストの実行中に未処理の例外が発生しました。エラーの詳細と、エラーがコードのどこで発生したかについては、スタックトレースを確認してください。

例外の詳細:System.Security.Cryptography.CryptographicException:パディングは無効であり、削除できません。

ソースエラー:

現在のWeb要求の実行中に、未処理の例外が生成されました。例外の発生源と場所に関する情報は、以下の例外スタックトレースを使用して識別できます。

スタックトレース:

[CryptographicException:パディングは無効であり、削除できません。]
System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte [] inputBuffer、Int32 inputOffset、Int32 inputCount、Byte []&outputBuffer、Int32 outputOffset、PaddingMode paddingMode、Boolean fLast)+1545747
System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte [] inputBuffer、Int32 inputOffset、Int32 inputCount)+257
System.Security.Cryptography.CryptoStream.FlushFinalBlock()+30 System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(Boolean fEncrypt、Byte [] buf、Byte [] modifier、Int32 start、Int32 length、Boolean useValidationSymAlgo) +164
System.Web.UI.Page.DecryptString(String s)+83
System.Web.Handlers.AssemblyResourceLoader.System.Web.IHttpHandler.ProcessRequest(HttpContext context)+148
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+358 System.Web.HttpApplication.ExecuteStep(IExecutionStep step、Boolean&completedSynchronously)+64

これは、特定のWebResource.axdリクエストへのリクエストで発生します。

私たちが見ている他のエラーはこれです:

viewstate MACの検証に失敗しました。このアプリケーションがWebファームまたはクラスターによってホストされている場合は、構成で同じvalidationKeyおよび検証アルゴリズムが指定されていることを確認してください。AutoGenerateはクラスターで使用できません。説明:未処理の例外が発生しました現在のWebリクエストの実行中。エラーの詳細と、エラーがコードのどこで発生したかについては、スタックトレースを確認してください。

例外の詳細:System.Web.HttpException:ビューステートMACの検証に失敗しました。このアプリケーションがWebファームまたはクラスターによってホストされている場合は、構成で同じvalidationKeyおよび検証アルゴリズムが指定されていることを確認してください。 AutoGenerateはクラスターでは使用できません。

このエラーは、フォームの投稿中に時々発生します。

ここで、このエラーに対する明らかな(通常の)答えを説明する前に、次のことを考慮してください。

  • アプリケーションはIIS6上のWindows Server 2003にデプロイされます
  • Webファームにはありません。ここでは1つのWebサーバーのみが使用されています。
  • アプリケーションプールIDはカスタムサービスアカウントであり、サーバーでaspnet_regiss -ga <username>を実行しました。無効。
30
Ben Scheirman

エラーは、アプリドメインがリサイクル/再起動されたためです。それがアプリケーションで発生し、マシンキーが自動に設定されている場合、それは変化します。これは、リソースのURL(.axd)のURLの情報の復号化に影響します。固定マシンキーを設定すると、それが二度と発生するのを防ぐことができます。

同様のケースの詳細については、これを確認してください(説明はビューステート検証の問題に関するものですが、原因は同じです): http://www.developmentnow.com/blog/InvalidViewstate+Or+ Unable + To + Validate + Data + Error.aspx

私もそれについてかなり長い間考えていました。私はこの質問を見た後、再びそれに気づきました: これは私のASP.Netサイトのセキュリティを破る試みですか? ...私はちょうど同じように答えました。アプリケーションをリサイクルする何かを公開したときにエラーがログに表示されたので、何かの再起動の前後にあると感じていましたが、その関係を示す他のソースがありませんでしたmachinekeyの変更:))

PS上記は最後に単一のサーバーでそれを説明します:)

24
eglasius

この問題は、ページがブラウザに完全に読み込まれる前に投稿が生成された場合に発生します。 this の質問をご覧ください。

1

ベン、

あなたの最初の問題について、私はこれが散発的に発生しているという点で、あなたが見ているものに少し近いように見えることを発見しました。 http://www.codeproject.com/KB/security/Cryptor.aspx#aes でこれの完全な説明を見つけることができるはずです。

本当に必要なことは、RijndaelAlg.PaddingをPaddingMode.ISO10126、PaddingMode.PKCS7、またはPaddingMode.ANSIX923に設定することです。暗号化と復号化で同じ値を使用する場合、これら3つの値のいずれかが機能するはずです。他の値は一部のデータでは機能しますが、すべてのデータでは機能しません。上記のURLに理由が説明されています。

私が理解していないのは、Microsoftが時々機能しないオプションを提供する理由、または少なくともそれらが信頼できるオプションにデフォルト設定されない理由です。

0
JohnL