繁体   English   中英

$ .post上没有必填的防伪表单字段“ __RequestVerificationToken”

[英]The required anti-forgery form field “__RequestVerificationToken” is not present on $.post

目前,我的帖子中没有显示我的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与我随数据发送的__RequestVerificationToken不同。 怎么会这样?

如此处所述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>
    }
});

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

使用MVC的AntiForgery.Validate()确实可以在这里验证防伪令牌的值,并且到目前为止效果非常好。 希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM