$ .post上不存在所需的防伪表单字段“__RequestVerificationToken”

时间:2017-11-13 09:00:18

标签: jquery asp.net ajax antiforgerytoken

目前我遇到的问题是我的AntiForgeryToken没有出现在我的帖子中,但据我所知,它确实在那里。

由于我不使用表单从我的HTML中获取数据而只是输入字段,因此我在页面底部使用以下内容创建了一个空表单:

@using (Html.BeginForm(null, null, FormMethod.Post, new { id = 
"__AjaxAntiForgeryForm" }))
{
    @Html.AntiForgeryToken()
}

这导致我可以使用jQuery获得AntiForgeryToken。

所以在我的Javascript中我做了:

                        var LoginData = {
                            EmailAddress: currentMail,
                            Password: password
                        }
                        var form = $('#__AjaxAntiForgeryForm');
                        var token = $('input[name="__RequestVerificationToken"]', form).val();

                        data = {
                            __RequestVerificationToken: token,
                            LoginData: LoginData
                        }

                        $.post(window.location,
                            {
                                scController: '*Controller*',
                                scAction: 'ValidateLogin',
                                data: data
                            }).done(function (d, e) { 
                                console.log("done");
                                console.log(d);
                                console.log(e);
                            }).fail(function (d, e) {
                                console.log("error");
                                console.log(d);
                                console.log(e);
                            });

我创建的数据对象导致:

{LoginData: {EmailAddress: "********", Password: "*******"}, __RequestVerificationToken: "Imagine a token here"}

然后我的控制器动作:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ResultMessage ValidateLogin(LoginData login)
    {
        return _userRepository.Login(login);
    }

出于某种原因,当我尝试做这个帖子时,我收到了这个错误:

“所需的防伪表格字段”__RequestVerificationToken“不存在。”

我做错了什么?

编辑1: 我看到Cookie标头中的__RequestVerificationToken与我发送的数据不同。这怎么可能?

2 个答案:

答案 0 :(得分:0)

如此处https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/preventing-cross-site-request-forgery-csrf-attacks所述,当与ajax一起使用时,必须在标题中发送防伪令牌,如下所示:

$.ajax("api/values", {
    type: "post",
    contentType: "application/json",
    data: {  }, // JSON data goes here
    dataType: "json",
    headers: {
        'RequestVerificationToken': <Token>
    }
});

答案 1 :(得分:0)

这是我在此问题上的分步方法。我正在使用angularJS,jquery,ASP.NET MVC 5 https://stackoverflow.com/a/57781976/2508781

使用MVC的AntiForgery.Validate()确实在这里验证了防伪令牌的价值,到目前为止,它还是很棒的。希望这可以帮助!

相关问题