ASP.NET MVC の Ajax 投稿に antiforgerytoken を含める 質問する

ASP.NET MVC の Ajax 投稿に antiforgerytoken を含める 質問する

私は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>

おすすめ記事