1. ホーム
  2. asp.net

[解決済み] ASP.NET MVCのAjaxポストでantiforgerytokenを含める。

2022-04-13 06:32:44

質問

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. のメッセージは、属性を戻してもまだポップアップします。

何か思い当たることはありますか?

EDIT

antiforgerytokenはフォーム内に生成されていますが、submitアクションを使用して送信していません。代わりに、jqueryを使用してトークンの値を取得し、それをajaxポストしようとしています。

ここにトークンを含むフォームがあり、マスターページのトップに位置しています。

<form id="__AjaxAntiForgeryForm" action="#" method="post">
    @Html.AntiForgeryToken()
</form>

解決方法は?

の指定が正しくありません。 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>