POST-ing 到 Razor 页面时出现 400 错误请求
400 Bad Request when POST-ing to Razor Page
我的页面有...
@page "{candidateId:int}"
...和
@Html.AntiForgeryToken()
模型有...
public void OnGet(int candidateId)
{
}
public void OnPost(int candidateId)
{
}
GET 工作正常。这是我的 AJAX 请求..
$.ajax({
type: "POST",
url: "/Skills/" + candidateId,
beforeSend: function (xhr) {
xhr.setRequestHeader("XSRF-TOKEN",
$('input:hidden[name="__RequestVerificationToken"]').val());
},
data: {
name: 'hi mum'
},
success: function (response) {
},
failure: function (response) {
alert(response);
}
});
浏览器收到无用的错误消息...400 错误请求。
我错过了什么?
您收到 400(错误请求)响应,因为框架期望 RequestVerificationToken
作为 posted request.The 框架的一部分使用它来防止可能的 CSRF 攻击。如果你的请求没有这个信息,框架会return 400 错误的请求。您当前的代码未发送。
将代码改成这样
headers:
{
"RequestVerificationToken": $('input:hidden[name="__RequestVerificationToken"]').val()
},
这将向请求 header 添加一个键为 RequestVerificationToken
的新项目,并且在进行调用时框架不应抛出 400 响应。 (假设您的视图代码为 __RequestVerificationToken
隐藏输入生成了隐藏输入)
您可以通过将 IAntiforgery
实现注入 view/page 并使用 GetAndStoreTokens
方法来使代码更健壮。
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
@functions{
public string GetAntiXsrfRequestToken()
{
return Xsrf.GetAndStoreTokens(Model.HttpContext).RequestToken;
}
}
并调用此 GetAntiXsrfRequestToken
函数以获取 javascript
中的值
headers:
{
"RequestVerificationToken": '@GetAntiXsrfRequestToken()'
},
您可能还想使用 PageModel 的 CandidateId
属性 来创建 url。像这样
url: "/Skills/@Model.CandidateId",
此外,您确实需要显式调用 @Html.AntiForgeryToken()
方法来生成令牌输入。使用没有 action 属性值的 post 方法的表单将为您生成隐藏的输入。
<form method="post">
<!-- your inputs-->
</form>
我的页面有...
@page "{candidateId:int}"
...和
@Html.AntiForgeryToken()
模型有...
public void OnGet(int candidateId)
{
}
public void OnPost(int candidateId)
{
}
GET 工作正常。这是我的 AJAX 请求..
$.ajax({
type: "POST",
url: "/Skills/" + candidateId,
beforeSend: function (xhr) {
xhr.setRequestHeader("XSRF-TOKEN",
$('input:hidden[name="__RequestVerificationToken"]').val());
},
data: {
name: 'hi mum'
},
success: function (response) {
},
failure: function (response) {
alert(response);
}
});
浏览器收到无用的错误消息...400 错误请求。
我错过了什么?
您收到 400(错误请求)响应,因为框架期望 RequestVerificationToken
作为 posted request.The 框架的一部分使用它来防止可能的 CSRF 攻击。如果你的请求没有这个信息,框架会return 400 错误的请求。您当前的代码未发送。
将代码改成这样
headers:
{
"RequestVerificationToken": $('input:hidden[name="__RequestVerificationToken"]').val()
},
这将向请求 header 添加一个键为 RequestVerificationToken
的新项目,并且在进行调用时框架不应抛出 400 响应。 (假设您的视图代码为 __RequestVerificationToken
隐藏输入生成了隐藏输入)
您可以通过将 IAntiforgery
实现注入 view/page 并使用 GetAndStoreTokens
方法来使代码更健壮。
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
@functions{
public string GetAntiXsrfRequestToken()
{
return Xsrf.GetAndStoreTokens(Model.HttpContext).RequestToken;
}
}
并调用此 GetAntiXsrfRequestToken
函数以获取 javascript
headers:
{
"RequestVerificationToken": '@GetAntiXsrfRequestToken()'
},
您可能还想使用 PageModel 的 CandidateId
属性 来创建 url。像这样
url: "/Skills/@Model.CandidateId",
此外,您确实需要显式调用 @Html.AntiForgeryToken()
方法来生成令牌输入。使用没有 action 属性值的 post 方法的表单将为您生成隐藏的输入。
<form method="post">
<!-- your inputs-->
</form>