私はAjaxのAntiForgeryTokenに問題を抱えています。私はASP.NET MVC 3を使用しています。jQuery Ajax 呼び出しと Html.AntiForgeryToken()このソリューションを使用すると、トークンが渡されるようになります。
var data = { ... } // with token, key is '__RequestVerificationToken'
$.ajax({
type: "POST",
data: data,
datatype: "json",
traditional: true,
contentType: "application/json; charset=utf-8",
url: myURL,
success: function (response) {
...
},
error: function (response) {
...
}
});
データ (トークンを含む) がコントローラーにパラメーターとして渡されているかどうかを確認するために属性を削除すると[ValidateAntiForgeryToken]
、渡されていることがわかります。しかし、何らかの理由で、A required anti-forgery token was not supplied or was invalid.
属性を戻すとメッセージが引き続き表示されます。
何か案は?
編集
アンチフォージェリトークンはフォーム内で生成されていますが、送信アクションを使用して送信していません。代わりに、jQuery を使用してトークンの値を取得し、それを Ajax で投稿しようとしています。
以下は、トークンが含まれ、マスター ページの上部に配置されているフォームです。
<form id="__AjaxAntiForgeryForm" action="#" method="post">
@Html.AntiForgeryToken()
</form>
ベストアンサー1
contentType
を誤って指定しましたapplication/json
。
これがどのように機能するかの例を次に示します。
コントローラ:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(string someValue)
{
return Json(new { someValue = someValue });
}
}
ビュー:
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "__AjaxAntiForgeryForm" }))
{
@Html.AntiForgeryToken()
}
<div id="myDiv" data-url="@Url.Action("Index", "Home")">
Click me to send an AJAX request to a controller action
decorated with the [ValidateAntiForgeryToken] attribute
</div>
<script type="text/javascript">
$('#myDiv').submit(function () {
var form = $('#__AjaxAntiForgeryForm');
var token = $('input[name="__RequestVerificationToken"]', form).val();
$.ajax({
url: $(this).data('url'),
type: 'POST',
data: {
__RequestVerificationToken: token,
someValue: 'some value'
},
success: function (result) {
alert(result.someValue);
}
});
return false;
});
</script>