0

新しい VS 2012 で新しい ASP.NET Web フォーム テンプレートを使用しています。IIS でいくつかの問題が発生したため、次のエラーが発生しました。

「System.Web.HttpException (0x80004005): ビューステート MAC の検証に失敗しました。このアプリケーションが Web ファームまたはクラスターによってホストされている場合は、構成で同じ validationKey と検証アルゴリズムが指定されていることを確認してください。AutoGenerate はクラスターでは使用できません。 --- > System.Web.UI.ViewStateException: 無効なビューステートです。"

次に、web.config に次の変更を加えました。

<pages validateRequest="false" enableEventValidation="false" viewStateEncryptionMode ="Never" enableViewStateMac="false" > ... </pages>

しかし、「アンチ XSRF トークンの検証に失敗しました」というエラーが表示されました。

その後、Site.Master.cs 内のすべてのコードに、アンチ XSRF トークンの検証に関するコメントを付けました (サイトがイントラネットで使用されているため)。ログに)、再度ログイン ページにリダイレクトされますが、ユーザーはログインしています。

更新 ここからすべてのソリューションを試しましたが、うまくいきません:http: //blogs.msdn.com/b/tom/archive/2008/03/14/validation-of-viewstate-mac-failed-error。 aspx。最後に、web.config でも試してみましたが、エラーが発生しました: System.InvalidOperationException: Anti-XSRF トークンの検証に失敗しました。それでも、解決策はありません。

更新 2 新しい ASP.NET Web フォーム テンプレート プロジェクトでアンチ XSRF トークンの検証を無効にする適切な方法はありますか?

4

1 に答える 1

2

ASP.NET のすべてのセキュリティ機能を無効にする (まったくお勧めできません) 代わりに、実際のエラーを解決することに集中する必要があります。

System.Web.HttpException (0x80004005): Validation of viewstate MAC failedよくあるエラーです。machinekeyこれを解決するには、web.config ファイルで使用するを定義する必要があります。これは通常、ポストバック全体で 2 つの異なるキーがあることが原因です。ほとんどの場合、web.config で定義すると問題が解決します (viewstate 暗号化などのセキュリティ機能を再度有効にすることを忘れないでください)。ここで生成できます: http://aspnetresources.com/tools/machineKey

例については、この投稿を参照してください: https://stackoverflow.com/a/6260201/375304 (ただし、同じキーは使用しないでください)。

また、このリンクを見てください。マシンキーに関連する ASP.NET セキュリティ機能を理解するのに役立つ場合があります。 http://msdn.microsoft.com/en-us/library/ff649308.aspx

更新:これのいずれかが機能しない場合は、次を試してください ( source ):

上記の #3 に基づく別のソリューションです。これを以下のコメントに投稿してくれた Alex に特に感謝します。彼は、この問題を修正する BasePage という小さなクラスを作成したので、Page ではなく BasePage からページを拡張するだけで済みます。

public class BasePage : Page
{
  private static string[] aspNetFormElements = new string[] 
  { 
    "__EVENTTARGET",
    "__EVENTARGUMENT",
    "__VIEWSTATE",
    "__EVENTVALIDATION",
    "__VIEWSTATEENCRYPTED",
  };

  protected override void Render(HtmlTextWriter writer)
  {
    StringWriter stringWriter = new StringWriter();
    HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
    base.Render(htmlWriter);
    string html = stringWriter.ToString();
    int formStart = html.IndexOf("<form");
    int endForm = -1;
    if (formStart >= 0)
      endForm = html.IndexOf(">", formStart);

    if (endForm >= 0)
    {
      StringBuilder viewStateBuilder = new StringBuilder();
      foreach (string element in aspNetFormElements)
      {
        int startPoint = html.IndexOf("<input type=\"hidden\" name=\"" + element + "\"");
        if (startPoint >= 0 && startPoint > endForm)
        {
          int endPoint = html.IndexOf("/>", startPoint);
          if (endPoint >= 0)
          {
            endPoint += 2;
            string viewStateInput = html.Substring(startPoint, endPoint - startPoint);
            html = html.Remove(startPoint, endPoint - startPoint);
            viewStateBuilder.Append(viewStateInput).Append("\r\n");
          }
        }
      }

      if (viewStateBuilder.Length > 0)
      {
        viewStateBuilder.Insert(0, "\r\n");
        html = html.Insert(endForm + 1, viewStateBuilder.ToString());
      }
    }

    writer.Write(html);
  }
}
于 2013-10-09T07:47:54.187 に答える