You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core中获取RequestVerificationToken必须依赖页面表单吗?

解决Razor Pages POST请求400错误:无需空表单获取防伪造令牌

核心结论

不是必须通过空表单才能获取RequestVerificationToken,Razor Pages的CSRF防伪造机制提供了多种更优雅的令牌获取与携带方式,空表单只是最简便但不够规范的一种。

优雅解决方案

1. 手动生成防伪造令牌(适配AJAX请求场景)

不需要包裹在<form>标签内,直接在页面任意位置输出防伪造令牌的隐藏字段:

@Html.AntiForgeryToken()

这段代码会自动生成一个name="__RequestVerificationToken"的隐藏输入框。后续发送AJAX请求时,将令牌值放到请求头或请求体中即可:

const token = document.querySelector('input[name="__RequestVerificationToken"]').value;

// 方式1:将令牌放入请求头
fetch('/YourPage', {
  method: 'POST',
  headers: {
    'RequestVerificationToken': token,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ id: 123 })
});

// 方式2:将令牌放入表单数据
const formData = new FormData();
formData.append('__RequestVerificationToken', token);
formData.append('id', 123);

fetch('/YourPage', {
  method: 'POST',
  body: formData
});

2. 为删除按钮生成专用表单(符合Razor Pages设计规范)

针对网格中的删除按钮,直接为每个按钮生成独立的小表单,Razor Pages会自动注入防伪造令牌,逻辑更清晰:

@foreach (var item in Model.GridData)
{
    <tr>
        <td>@item.Name</td>
        <td>
            <form method="post" asp-page-handler="Delete" asp-route-id="@item.Id">
                <button type="submit" class="btn btn-danger">删除</button>
            </form>
        </td>
    </tr>
}

这种方式无需额外编写JS,点击按钮直接提交表单,自动携带令牌,完全契合Razor Pages的表单提交模式。

3. 选择性关闭防伪造验证(谨慎使用)

若你的删除接口确实不存在CSRF风险(比如仅内部系统使用,且有其他身份验证机制兜底),可在页面模型或特定处理方法上添加[IgnoreAntiforgeryToken]特性,跳过令牌验证:

public class YourPageModel : PageModel
{
    [IgnoreAntiforgeryToken]
    public IActionResult OnPostDelete(int id)
    {
        // 执行删除逻辑
        return RedirectToPage();
    }
}

⚠️ 注意:该方式会关闭对应接口的CSRF防护,除非确定风险极低,否则不推荐使用。

内容的提问来源于stack exchange,提问作者Legion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 20:42:12