发布到 Razor 页面时出现 400 错误请求

Posted

技术标签:

【中文标题】发布到 Razor 页面时出现 400 错误请求【英文标题】:400 Bad Request when POST-ing to Razor Page 【发布时间】:2018-06-30 14:11:16 【问题描述】:

我的页面有...

@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 Bad Request。

我错过了什么?

【问题讨论】:

400 错误应该包含更多信息。它向您显示的实际错误是什么? 我不认为它与 AJAX 调用有关。 但服务器响应将包含更多信息。检查浏览器调试工具。 响应选项卡显示“响应没有可用数据”。它实际上只是一个数字和“坏”这个词。 :) 查看页面的视图源。您是否生成了 __RequestVerificationToken 隐藏输入? 【参考方案1】:

您收到 400(错误请求)响应,因为框架期望 RequestVerificationToken 作为发布请求的一部分。框架使用它来防止可能的 CSRF 攻击。如果您的请求没有此信息,框架将返回 400 bad request。您当前的代码未发送。

把代码改成这个

headers:

    "RequestVerificationToken": $('input:hidden[name="__RequestVerificationToken"]').val()
,

这将在请求标头中添加一个带有键 RequestVerificationToken 的新项目,并且框架在调用时不应抛出 400 响应。 (假设您的视图代码为 __RequestVerificationToken 隐藏输入生成了隐藏输入)

您可以通过将IAntiforgery 实现注入视图/页面并使用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() 方法来生成令牌输入。具有 post 方法且没有 action 属性值的表单将为您生成隐藏的输入。

<form method="post">
   <!-- your inputs-->
</form>

【讨论】:

“您收到 400(错误请求)响应,因为框架期望 RequestVerificationToken 作为已发布请求的一部分。”我可以在文档中的哪里找到这些特定信息?请张贴链接。 遇到了同样的问题,我的表单中缺少@Html.AntiForgeryToken() 如果您需要接受来自外部站点的 POST 怎么办?我们无法包含防伪令牌的网站。 @mxmissile 您可以通过使用[IgnoreAntiforgeryToken(Order = 1001)] 装饰您的PageModel 来忽略防伪令牌的验证。在此处查看更多信息:learnrazorpages.com/security/request-verification#opting-out 你救了我的救命恩人。

以上是关于发布到 Razor 页面时出现 400 错误请求的主要内容,如果未能解决你的问题,请参考以下文章

使用 NativeEthernet 发布到 InfluxDB 时出现 400 错误请求

从 React 向 Django 发送 post 请求时出现 400(错误请求)

尝试从 ajax(Wordpress 插件)将 FormData 中的 Blob 发布到 php 时出现 400(错误请求)

通过 Retrofit 调用发布请求时出现 400 bad request 错误

在 Express.js 上使用 Axios 向 Spotify API 发出 POST 请求时出现错误 400

debug = False 时出现错误请求 400