0

私はしばらくの間、オーチャード モジュールで Ajax と一緒に AntiForgery オプションをうまく使用してきました。最近、デフォルトの ContentType = 'application/x-www-form-urlencoded; の使用から変更したいと考えています。charset=UTF-8' を JSON ペイロード (ContentType='application/JSON') に変換します。

これを行うとすぐに、ASP.NET によって例外がスローされ、「必要な偽造防止トークンが提供されなかったか、無効でした。」わかりましたが、JSON ペイロードを保持しながら __RequestVerificationToken を追加するにはどうすればよいでしょうか?

参考までに、私が使用しているコードは次のとおりです。

    var config = {
        url: url,
        type: "POST",
        data: data ,
        dataType: "json",
        contentType: "application/json; charset=utf-8"
    };
    $.ajax(config);

コントローラー (ここに到達する前に、「必要な偽造防止トークンが提供されなかったか、無効でした。」で爆発します):

    [HttpPost]
    public ActionResult Update(ShoppingCartItemVM[] items)
    {
       // do stuff
    }

これは Orchard AntiForgery ラッパーまたは MVC AntiForgery 機能の制限ですか? それとも私は(再び)愚かですか?

4

2 に答える 2

2

ギスカードは正しいです。もう少し掘り下げます。

注: 偽造防止トークンが必要なのは、オーチャード コントローラーの「投稿」結果のみです。そのため、json のリクエストで「Get」を使用する場所を覚えておく必要はありません。

多くの場合、リクエスト トークン以外のデータを送信する必要があります。その場合、リクエストで送信する「データ」オブジェクトには、その __RequestVerificationToken 値が含まれている必要があります。その場合、jQuery は次のように役立ちます。

var defaultPostValues = { __RequestVerificationToken:'@Html.AntiForgeryTokenValueOrchard()', id: 1, ..etc.. };
var myValues = { answers: [1,5,5,10] };
var data = $.extend({}, defaultPostValues, myValues); 

var config = {
    url: url,
    type: "POST",
    data: data ,
    dataType: "json",
    contentType: "application/json; charset=utf-8"
};
$.ajax(config);

偽造防止トークンは、モジュール定義ごとにオフにすることもできます (私の記憶が正しければ?)。モジュール.txt

Name: Polls
AntiForgery: false
Author: Matt
... removed for brevity 
Features:
    Polls
... etc

ただし、呼び出しがオーチャードのモジュール内にある場合は偽造防止を使用し、外部要求によってデータが必要な場合にのみ無効にすることをお勧めします。しかし、その場合には Orchard 内で WebAPI をお勧めしますが、それはまったく新しいストーリーを生み出し、おそらく範囲外になる可能性があります。

于 2012-09-20T12:56:44.170 に答える
0

多分これを試してください:

​data = {color: 'red', weight:'20lbs'};

// do some more work...

// Append the anti-forgery token to the POST values: 
data['__RequestVerificationToken'] = '@Html.AntiForgeryTokenValueOrchard()';

// Make the .ajax() call: 
var config = {
    url: url,
    type: "POST",
    data: data ,
    dataType: "json",
    contentType: "application/json; charset=utf-8"
};
$.ajax(config);

かみそりビュー以外の場所でjsonを形成している場合は、かみそりビュー@Html.AntiForgeryTokenValueOrchard()内で実行し、それをjavascriptオブジェクトまたは変数に渡して、javascriptを介してjsonに追加できます。

編集: Matthew が投稿したメソッドに加えて、.extend() を使用せずに AJAX 呼び出しを行う直前に、偽造防止トークンを POST 値に追加することもできます。例: http://jsfiddle.net/JC66L/ .

于 2012-09-20T01:28:57.433 に答える