目前我遇到的问题是我的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与我发送的数据不同。这怎么可能?
答案 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()
确实在这里验证了防伪令牌的价值,到目前为止,它还是很棒的。希望这可以帮助!