27

MVC プロジェクトの以下の詳細に問題があります。

回転gif(またはテキスト)のようなロードパネルでjquery ajaxリクエストを使用しようとすると、フィドラーから観察されたエラーが発生します

必須の偽造防止フォーム フィールド「__RequestVerificationToken」が存在しません。

POST アクション メソッドでコメント [ValidateAntiForgeryToken] attribute し、ローディング パネルを使用すると、問題なく動作します。このエラーが発生する理由を知りたいです。

でシリアル化されたクエリ文字列も使用しました

__RequestVerificationToken= $('input[name="__RequestVerificationToken"').val()

それでもエラーが発生します

偽造防止トークンを復号化できませんでした。このアプリケーションが Web ファームまたはクラスターによってホストされている場合は、すべてのコンピューターが同じバージョンの ASP.NET Web ページを実行していること、および<machineKey>構成で明示的な暗号化と検証キーが指定されていることを確認してください。

AutoGenerate はクラスタでは使用できません

何を使えばいいですか?

ここで質問コードを更新しました

var token = $('input[name="__RequestVerificationToken"]').val();
$('#submitaddress').click(function subaddr(event) {
    event.preventDefault();
    event.stopPropagation();
  //$('#addAddress').html('<img src="/img/animated-overlay.gif"> Sending...');
   // $('#addAddress').blur();
    //  $(this).bl
    if ($('#Jobid').val()!="") {
        $('#TransportJobId').val(parseInt($('#Jobid').val()));
        $.ajax(
              {
                  url: '/TransportJobAddress/create',
                  type: 'POST',
                  data: "__RequestVerificationToken=" + token + "" + $('form[action="/TransportJobAddress/Create"]').serialize(),
                  success: function poste(data, textStatus, jqXHR) { $('#addAddress').html(data); return false; },
                  error: function err(jqXHR, textStatus, errorThrown) { alert('error at address :' + errorThrown); }
              });
    }
    else {
        var transportid = 2;
        $.ajax({
            url: '/TransportJob/create',
            type: 'POST',
            data: "__RequestVerificationToken=" + token + "" + $('form[action="/TransportJob/Create"]').serialize(),
            success: function sfn(data, textStatus, jqXHR) {
                transportid = parseInt(data);
                $('#Jobid').val(data);
               // alert('inserted id :' + data);
                $('#TransportJobId').val((transportid));
                $.ajax(
         {

             url: '/TransportJobAddress/create',
             type: 'POST',
             //beforeSend: function myintserver(xhr){  
             //        $('#addAddress').html('<div id="temp_load" style="text-align:center">please wait ...</div>');
             //}, 
             data: "__RequestVerificationToken=" + token + "" + $('form[action="/TransportJobAddress/Create"]').serialize(),
             success: function poste(data, textStatus, jqXHR) {
                 $('#addAddress').html(data);

             },
             error: function err(jqXHR, textStatus, errorThrown) {
                 alert('error at address :' + errorThrown);
             }

         });
            },
            error: function myfunction(jqXHR, textStatus, errorThrown) {
                alert("error at transport :" + jqXHR.textStatus);
            },
            complete: function completefunc() {
              //  alert('ajax completed all requests');
                return false;
            }

        });
    }
});

フォームタグ

<form action="/TransportJob/Create" method="post"><input     name="__RequestVerificationToken" type="hidden"   value="ydYSei0_RfyBf619dQrhDwwoCM7OwWkJQQEMNvNdAkefiFfYvRQ0MJYYu0zkktNxlJk_y1ZJO9-yb-  COap8mqd0cvh8cDYYik4HJ0pZXTgE1" />   

同じページの TransportJob フォーム タグ 2

<form action="/TransportJobAddress/Create" method="post" novalidate="novalidate"><input name="__RequestVerificationToken" type="hidden"    value="Np2vUZJPk1TJlv846oPSU6hg4SjMHRcCk1CacaqZbpHOg8WbV4GZv06noRDl7F_iT9qQf3BIXo3n9wGW68sU mki7g3-ku_BSHBDN-g2aaKc1"> 

4

5 に答える 5

0

Ajax と通常のリクエストの両方を保護したかったので、次のようになりました。

まず、 haacked.comの優れたブログを使用して、 説明に従って ConditionalFilterProvider を作成しました。

次に、 codethinkedのブログで説明されているように、すべてのクラスを作成しました。

私の _layout ページで、ブログで説明されているように $.ajaxPrefilter を使用してピースを追加しました... これにより、すべての Ajax コールバックがヘッダーを介して Antiforgery トークンを送信するようになりました。

すべてを接着するために、このコードを global.asax / Application_Start に追加しました

(c, a) =>
                    (c.HttpContext.Request.IsAjaxRequest() &&
                     !string.Equals(c.HttpContext.Request.HttpMethod, "GET"))
                        ? new AjaxValidateAntiForgeryTokenAttribute()
                        : null,
(c, a) =>
                    (!c.HttpContext.Request.IsAjaxRequest() &&
                     string.Equals(c.HttpContext.Request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase))
                        ? new ValidateAntiForgeryTokenAttribute()
                        : null

基本的に..GETではないすべてのコントローラーに属性を挿入します。

その後、すべての (ごく少数の) フォームに移動して、@Html.AntiForgeryToken() を追加するだけで済みました。

すべてが機能したことを証明するために、AntiForgeryToken を使用せずにフォームを作成して、予期される例外を取得しようとしました。$.ajaxPrefilter を削除して Ajax リクエストを作成すると、予想される例外が受信されました。

于 2014-01-09T10:17:57.223 に答える