SOでこれを行う方法の例を見てきましたが、私が知る限り、これまでのところ成功していないすべての例を試しました。いくつかの実装をシナリオに合わせて変更しようとしましたが、これもこれまでのところ失敗しています。
これは _layout.cshtml のページにあるため、常にトークンを使用できます。
<form id="__AjaxAntiForgeryForm" action="#" method="post"> @Html.AntiForgeryToken()</form>
JavaScript utils ファイルにもこのメソッドがあります。
AddAntiForgeryToken = function (data) {
data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val();
return data;
};
これはすべて期待どおりに機能しており、偽造防止トークンを取得しています。私の実際の投稿コードは次のとおりです。
myPage.saveData = function() {
var saveUrl = '/exercises/PostData';
var myData = JSON.stringify(myPage.contextsArrays);
$.ajax({
type: 'POST',
async: false,
url: saveUrl,
data: AddAntiForgeryToken({ myResults: myData }),
success: function () {
alert('saved');
},
dataType: 'json',
contentType: "application/json; charset=utf-8"
});
};
私のアクションメソッドは次のようになります。
[HttpPost, ValidateAntiForgeryToken, JsonExceptionFilter]
public JsonResult PostData(List<ResultsDc> myResults)
{
return Json(_apiClient.SubmitResults(myResults));
}
私が試してきたさまざまな実装でこれをテストしてきましたが、応答は常に次のとおりです。
{"errorMessage":"The required anti-forgery form field \"__RequestVerificationToken\" is not present."}
フォームを投稿するのではなく、単なるデータの配列ですが、実際に投稿されるデータを確認すると、Json が正しく見えません (すべてエンコードされています) が、__RequestVerificationToken パラメーター名があり、トークン値も存在します。
現時点では、これらすべてにかなり混乱しており、MVC アクションが呼び出されるようにトークンを送信する正しい方法を見つけることができません。ValidateAntiForgeryToken
属性を削除しJSON.stringify(myPage.contextsArrays);
てデータとして持つと、json は正しく (エンコードされていない) ように見え、正常にマップされます。
このトークンをフォームなしで適切に投稿するにはどうすればよいですか?