如何防止在ajax中自动获取__RequestVerificationToken?

时间:2015-12-25 18:30:30

标签: ajax asp.net-mvc-5

我正在使用asp.net mvc 5并创建一个通过ajax登录的表单(服务器端需要[ValidateAntiForgeryToken])。

我在视图中没有任何问题:

@using (Html.BeginForm("Login", "Account", FormMethod.Post, new { id = "loginForm" }))
{
    @Html.AntiForgeryToken()    

    <!-- more tags -->
}

但我收到错误消息

  

无法解密防伪令牌。

当我尝试调用此方法时:

//u is url string, f is FormData()
var submit = function (u, f) {    
    $.ajax({
        url: u,
        type: 'POST',
        data: { __RequestVerificationToken: $($('#loginForm input[name=__RequestVerificationToken]')[0]).val(), model: f },
        processData: false,
        contentType: false
    }).done(function (data) {
        if (data.success) {
            /* successfull login */
            Custombox.close();
            window.location.href = '/?type=promotion'
        } else {
            /* server returned exception message */
            $('div.validation-summary-valid').html(data.ex)
        }
    }).fail(function (error) {
        /* connect to server failure */
        $('div.validation-summary-valid').html(data.ex)
    })
};

以下是标题快照:

__

为什么要复制__RequestVerificationToken以及如何解决它?

1 个答案:

答案 0 :(得分:1)

我猜你要发两次。 一旦显式地通过读取f变量中的输入字段值和第二个,我假设它是一个序列化的形式。

解决方案:删除您明确发送的部分。

您只需序列化表单并发送即可。这将包括RequestVerificationToken。

$(function () {
    $("#yourSubmitBtnId").click(function (e) {
        e.preventDefault();

        var f = $("#loginForm");
        var formData =   JSON.stringify(f.serialize());

        var u = f.attr("action");
        $.ajax({
            url: u,
            type: 'POST',
            data:formData,
            processData: false,
            contentType: "application/json",
        }).done(function (data) {
           //do something
        }).fail(function (error) {
           //do something else
        });    

    });   
});